Pythonには、次のようなC
プリプロセッサステートメントの類似物がありますか?:
#define MY_CONSTANT 50
また、いくつかのクラスにインポートしたい定数の大きなリストがあります。 .py
ファイルで上記のような長い一連のステートメントとして定数を宣言し、別の.py
ファイルにインポートする類似物はありますか?
編集。
ファイルConstants.py
の読み取り:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
そしてmyExample.py
読み取り:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __== '__main__':
x = MyClass()
編集。
コンパイラーから、
NameError:「グローバル名「MY_CONSTANT_ONE」が定義されていません」
function init myExample in line 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copy outputプログラムは、0.06秒後にコード#1で終了しました。
Pythonは前処理されていません。ファイルを作成するだけで_myconstants.py
:
MY_CONSTANT = 50
そしてそれらをインポートするだけで動作します:
import myconstants
print myconstants.MY_CONSTANT * 2
Pythonにはプリプロセッサがなく、変更できないという意味で定数もありません-いつでも変更できます(ほぼ、定数オブジェクトのプロパティをエミュレートできますが、定数のためにこれを行うことはめったにありません完了し、有用とはみなされない)すべて。定数を定義するときは、アンダースコア付きの大文字の名前を定義し、それを1日と呼びます。「ここではすべて大人に同意しています」と言っても、正気な人は定数を変更しません。もちろん、彼には非常に正当な理由があり、彼が何をしているかを正確に知っている場合を除き、どちらの場合も彼を止めることはできません(できれば禁止すべきではありません)。
ただし、もちろん、モジュールレベルの名前を値で定義し、別のモジュールで使用できます。これは、定数または特定のものではなく、モジュールシステムで読み取られます。
# a.py
MY_CONSTANT = ...
# b.py
import a
print a.MY_CONSTANT
そしてもちろんできること:
# a.py
MY_CONSTANT = ...
# b.py
from a import *
print MY_CONSTANT
もちろん、定数を別のモジュールに入れることができます。例えば:
const.py:
A = 12
B = 'abc'
C = 1.2
main.py:
import const
print const.A, const.B, const.C
上記で宣言したように、A
、B
、およびC
は変数であることに注意してください。つまり、実行時に変更できます。
見てみてください 「設定」モジュールを使用して定数を作成しますか? および Pythonでオブジェクトの変更を防止できますか?
別の便利なリンク: http://code.activestate.com/recipes/65207-constants-in-python/ は、次のオプションについて説明します。
from copy import deepcopy
class const(object):
def __setattr__(self, name, value):
if self.__dict__.has_key(name):
print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
return deepcopy(self.__dict__[name])
self.__dict__[name] = value
def __getattr__(self, name, value):
if self.__dict__.has_key(name):
return deepcopy(self.__dict__[name])
def __delattr__(self, item):
if self.__dict__.has_key(item):
print 'NOOOOO' # throw exception if needed
CONST = const()
CONST.Constant1 = 111
CONST.Constant1 = 12
print a.Constant1 # 111
CONST.Constant2 = 'tst'
CONST.Constant2 = 'tst1'
print a.Constant2 # 'tst'
したがって、このようなクラスを作成してから、contants.pyモジュールからインポートできます。これにより、値が変更、削除されないことを確認できます。
いくつかの回答で説明されているインポートアプローチを使用する代わりに、 configparser モジュールを見てください。
ConfigParserクラスは、Microsoft Windows INIファイルで見られるものと同様の構造を提供する基本構成ファイルパーサー言語を実装します。これを使用してPython =エンドユーザーが簡単にカスタマイズできるプログラム。