2017-10-30 1 views
5

의 내가 다음 열거 있다고 가정 해 봅시다?파이썬 3에서 열거 형 필드를 직접 가져올 수 있습니까?</p> <pre><code>class LineStyle(Enum): SOLID = 'solid' DASHED = 'dashed' DASHDOT = 'dashdot' DOTTED = 'dotted' </code></pre> <p>이 가능 어떻게 든 직접 열거에서 필드를 가져올 수 :

예 :

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

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

이 할 수있는 더 우아한 방법이 있나요 : 내가 생각할 수

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

유일한 해결 방법은 모듈 변수로 모든 열거 필드를 선언한다?

+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 매핑이므로, 위의 글로벌 네임 스페이스에 모두 이름을 추가합니다 반복, 당신은 별명이 그에 포함하지 않으려는 경우

>>> 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'> 

가하는 for 루프를 사용 LineStyle 개체 이상 그러면 멤버 개체가 제공되고 그 개체 개체에서 이름을 가져올 수 있습니다.

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

동적으로 필드를 생성하는 것은 나에게 처음부터 열거 형을 사용하는 목적을 다소 상쇄합니다. "의사 강한 입력"/ IDE 친화적 인 코드를 사용하므로 내 해결 방법을 고수 할 것입니다. 어쨌든 감사드립니다. – nicoulaj

+0

@nicoulaj : 물론, 그렇지만 스스로 반복해야하는 댓가를 치뤄야합니다. 개인적으로 나는 전역을 만들지 않을 것입니다. –

관련 문제