如何在启动时为 attr.s 设置默认值?

How to set default for attr.s at initiation?

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

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

以下代码示例默认为 None。

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

代码当前仅在环境变量设置为 shell 级别时才有效。所以在终端中执行 export TEST_TMPDIR="/tmp/" 然后读取 Settings() 就可以了。

尝试在 __attrs_post_init__ 中读取 os.environ["TEST_TMPDIR"] 它 return 由 python 代码设置的值。

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

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

像这样的东西应该有用(抱歉,我在 phone):

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) 的语法糖)