3

ここで尋ねられる質問に似た質問があります:Pythonファイルへの定数の長いリストのインポート

基本的に、定数の長いリストを含む別のモジュールがあります。

constants.py

x = 1.2
y = 30.4
.
.
.

別のモジュールでは、これらの定数をインポートして、インスタンス属性として初期化します。

class.py

class something(object):
    def __init__(self):
        import constants
        self.x = constants.x
        self.y = constants.y
        .
        .
        .

すべての変数名を再入力する代わりに、これを行うためのより簡単な、またはよりPython的な方法はありますか?

4

5 に答える 5

5

Python 開発者はConfigParserと呼ばれるクールなソリューションを開発しました。

実際の例: config.ini

[constants]
key = value
x = 0
y = 1

class.py

from ConfigParser import SafeConfigParser
class MyClass(object):
    def __init__(self, **kwargs):
        self.config = SafeConfigParser(defaults=kwargs).read('config.ini')

    def get_x(self):
        return self.config.get('constants', 'x')

これが役立つことを願っています。

編集:インスタンス属性が必要な場合は、次のことができます。

class MyClass(object):
    ...
    def __getattr__(self, key):
        return self.config.get('constants', key)

EDIT2: Python ファイルが必要で、.ini ファイルは解決策ではありませんか?

from . import config
class Myclass(object):
    def __getattr__(self, key):
        return getattr(config, key)
于 2012-10-31T13:01:45.487 に答える
1

常に次のようなものがあります:

class something(object):
    def __init__(self):
        import constants
        for name in ['x', 'y', ...]:
            setattr(self, name, getattr(constants, name))

これには、何度も繰り返さself.X = constants.Xないという利点があり、名前を1か所に1回だけリストすることを意味します。

あなたはこれを使うことができます:

for name, value in constants.__dict__.iteritems():
    setattr(self, name, value)

constants明示的にリストせずにすべての名前をバインドすることですが、私は個人的にはそうしません。somethingオブジェクトが実際にどの属性を持っているかがはっきりしなくなり、Pythonモジュールが思ったよりも多くの名前を含むようになるのは非常に簡単です。たとえば、すべての定数を定義する過程で別のモジュール(たとえばmath)をインポートする必要がある場合、すべてのインスタンスconstantsの予期しないmath属性が発生することになりsomethingます。

インポートしようとしている名前を明示的にリストする方が明確だと思います。somethingさらに、プログラムの他の部分で使用する定数を追加する必要があることがわかった場合でも、すべてのインスタンスに影響を与えることはありません(定数が関連性を持つことができる場合はsomething、実際ににリストする必要があります)something。外部モジュールではありません)。

于 2012-10-31T12:04:27.087 に答える
1

あなたができる

for constant, value in constants.__dict__.values():
  setattr(self, constant, value)

なぜインスタンス属性としてそれらが必要なのですか?

于 2012-10-31T11:57:35.717 に答える
1

モジュール内のクラスに定数を入れることができます。このクラスは、より簡単に受け渡すことができます。また、これらの定数をクラス属性として必要とするクラスの mixin クラスとして使用することもできます。

class Constants(object):
    x = 1.2
    y = 30.4


# optional 
class Base(object):
    pass

class Something(Constants, Base):
    pass


s = Something()

print(s.x)

ただし、それは単なるデータであるため、おそらく辞書などの何らかのタイプのデータ構造を使用してそれらを保持します。どのコードでも同じようにモジュールからそれらを参照できるのに、なぜそれらをクラス属性として配置する必要があるのか​​ わかりません。

于 2012-10-31T12:02:51.047 に答える
0

from constants import x, y後で誤って変数をオーバーライドしないように注意してください (つまり、一般的な名前を使用しないでください)。

于 2012-10-31T11:58:09.710 に答える