【问题标题】:How to set default for attr.s at initiation?如何在启动时为 attr.s 设置默认值?
【发布时间】:2021-06-05 05:15:41
【问题描述】:

使用 python attrs 库并尝试在 Settings 对象中设置目录路径。当从 shell 本身设置环境变量时,这很有效。但是,如果没有从 shell 设置 TEST_TMPDIR 并且我尝试在 python 代码本身中设置该值,则默认值初始化为 None。

   @attr.s(frozen=True)
    class Settings(object):
      test_tmpdir = attr.ib(default=os.environ.get("TEST_TMPDIR"))

以下代码示例,默认为无。

os.environ["TEST_TMPDIR"] = '/tmp/'
setting = Settings()

只有在 shell 级别设置环境变量时,代码当前才有效。因此,在终端中执行 export TEST_TMPDIR="/tmp/" 然后读取 Settings() 即可。

尝试在__attrs_post_init__ 中读取 os.environ["TEST_TMPDIR"] 它确实返回了 python 代码设置的值。

关于为什么在启动时未设置默认值的任何链接都会有所帮助。

【问题讨论】:

    标签: python attr python-attrs


    【解决方案1】:

    使用attr.Factory。这是在实例化时调用的可调用对象。在您的情况下,您可以使用 functools.partial 创建工厂,因为参数是固定的。

    这样的事情应该可以工作(抱歉,我正在打电话):

    import attr
    from functools import partial
    
    @attr.frozen
    class C:
        test_tmpdir = attr.ib(factory=partial(os.environ.get, "TEST_TMPDIR"))
    

    factory=xdefault=attr.Factory(x) 的语法糖)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2020-12-14
      • 2012-05-02
      • 2017-12-26
      相关资源
      最近更新 更多