python默认配置重用变量

时间:2016-09-15 18:59:07

标签: python

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)

上面的代码给出了以下错误。

      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的值。有没有办法在不编写yml文件的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

无法找到DefaultConfing,因为DefaultConfig在创建S3时尚未定义。

请记住,班级是对象。因为有对象,这意味着它们需要实例化。 Python在其定义的末尾实例化一个类,因此在globals中注册它。由于类定义尚未完成,因此无法使用DefaultConfig名称。

答案 1 :(得分: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