2016-09-15 71 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.S3.DATA_ROOT 此外,這是我在寫作的結構化配置與DefaultConfig值的重用嘗試。有沒有辦法做到這一點,而不寫一個XML文件?

+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

這是無法找到DefaultConfing因爲DefaultConfig在創建S3此刻沒有定義。

請記住,類是對象。因爲有對象,這意味着他們需要實例化。 Python在其定義結束時實例化一個類,並將其註冊到全局變量中。由於類定義尚未完成,因此不能使用DefaultConfig名稱。