2016-09-15 2 views
1
class DefaultConfig(object): 
    class S3(object): 
     DATA_ROOT = 's3://%(bucket_name)s/NAS' 
     DATA_LOCATION = '{}/%(instrument_id)s/%(run_id)s'.format(DefaultConfig.S3.DATA_ROOT) 

위의 코드는 다음과 같은 오류가 발생합니다.python 기본 구성 변수 재사용

 File "./s3Utils.py", line 5, in <module> 
    from InfraConfig import InfraConfig as IC 
    File "/opt/src/datasource/src/main/python/util/InfraConfig.py", line 4, in <module> 
    class DefaultConfig(object): 
    File "/opt/src/datasource/src/main/python/util/InfraConfig.py", line 6, in DefaultConfig 
    class S3(object): 
    File "/opt/src/datasource/src/main/python/util/InfraConfig.py", line 14, in S3 
    DATA_LOCATION = '{}/%(instrument_id)s/%(run_id)s'.format(DefaultConfig.S3.DATA_ROOT) 
NameError: name 'DefaultConfig' is not defined 

왜이 DefaultConfig의 값의 재사용 구조화 된 구성을 작성하려고 시도한, 그것은 수없는 또한 DefaultConfig.S3.DATA_ROOT 을 찾는 것입니다. yml 파일을 작성하지 않고이를 수행 할 수있는 방법이 있습니까?

+1

@ ŁukaszRogalski : 이것은 실제로 MCVE입니다. – user2357112

+0

@ user2357112 그래, 내가 잘못 읽고 잘못 해석했다. –

답변

1

당신은 어떤 접두사없이 사용한다 :

class DefaultConfig(object): 
    class S3(object): 
    DATA_ROOT = 's3://%(bucket_name)s/NAS' 
    DATA_LOCATION = '{}/%(instrument_id)s/%(run_id)s'.format(DATA_ROOT) 

print DefaultConfig.S3.DATA_LOCATION 

반환 :

> s3://%(bucket_name)s/NAS/%(instrument_id)s/%(run_id)s 
2

DefaultConfingDefaultConfig 때문에이 S3가 생성되는 순간에 정의되지 않은 찾을 수 없습니다.

클래스는 개체라는 것을 기억하십시오. 객체가 있기 때문에 인스턴스화해야한다는 의미입니다. 파이썬은 정의의 끝에서 클래스를 인스턴스화하고 따라서이를 전역에 등록합니다. 클래스 정의가 완료되지 않았기 때문에 DefaultConfig 이름을 사용할 수 없습니다.