2017-10-30 12 views
5

はの私は、次の列挙型を持っているとしましょう:Python 3で列挙型フィールドを直接インポートすることは可能ですか?

class LineStyle(Enum): 
    SOLID = 'solid' 
    DASHED = 'dashed' 
    DASHDOT = 'dashdot' 
    DOTTED = 'dotted' 

は何とか直接この列挙からフィールドをインポートすることが可能ですか?

例:

from mymodule.LineStyle import SOLID, DASHED # does not work 

私は、モジュール変数として、すべての列挙型のフィールドを宣言していると考えることができる唯一の回避策:

class LineStyle(Enum): 
    SOLID = 'solid' 
    DASHED = 'dashed' 
    DASHDOT = 'dashdot' 
    DOTTED = 'dotted' 

SOLID = LineStyle.SOLID 
DASHED = LineStyle.DASHED 
DASHDOT = LineStyle.DASHDOT 
DOTTED = LineStyle.DOTTED 

はこれを行うにはよりエレガントな方法はありますか?

+0

インポートメカニズムはクラスの項目にアクセスできません。そう、いいえ。 –

+0

'LineStyle.SOLID'のように使用できないのはなぜですか?なぜあなたはそれのための別の変数が必要ですか? – Andrey

+2

これは美容上の理由から/コードの簡潔さのためです。 'plot_some_stuff(color = RED、line_style = DOTTED)'の代わりに 'plot_some_stuff(color = Color.RED、line_style = LineStyle.DOTTED)'のようなものを持つことは冗長です。 – nicoulaj

答えて

6

No. importはモジュールオブジェクト自体またはモジュール内の最上位レベルの名前を参照する参照を現在の名前空間に追加することができます。列挙型の値は、回避策のように明示的に配置しない限り、モジュール内の最上位の名前ではありません。

あなたは、あなたのモジュールグローバルへ__members__ attributeからすべての情報を追加することによって、グローバルにそれらの名前を割り当てる自動化をすることができます

globals().update(LineStyle.__members__) 

globals() functionはあなたをさせる、あなたの現在のモジュールの名前空間への参照を提供しますその名前空間に動的に名前を追加します。 LineStyle.__members__属性は(aliasesを含む)の値に名前のAAマッピングであるので、上記のグローバル名前空間にすべての名前を追加します。あなたはエイリアスがその中に含またい、forループを使用し、反復しない場合は

>>> from enum import Enum 
>>> class LineStyle(Enum): 
...  SOLID = 'solid' 
...  DASHED = 'dashed' 
...  DASHDOT = 'dashdot' 
...  DOTTED = 'dotted' 
... 
>>> SOLID 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'SOLID' is not defined 
>>> globals().update(LineStyle.__members__) 
>>> SOLID 
<LineStyle.SOLID: 'solid'> 

LineStyleオブジェクトを使用します。それはあなただけの名前をプルすることができますメンバーオブジェクトを提供します:

for member in LineStyle: 
    globals()[member.name] = member 
+0

フィールドを動的に生成することは、最初に私のためにEnumを使用する目的をちょうど打ち消します。これは「擬似強い型付け」/ IDEフレンドリなコードを持つことですので、私は回避策に固執します。 – nicoulaj

+0

@nicoulaj:確かに、しかし、あなた自身を繰り返さなければならないという代価を支払う。個人的には、グローバル化は一切しません。 –

関連する問題