gpt4 book ai didi

python - 如果变量在被另一个函数访问 "initialized"之前被访问,则引发异常

转载 作者:行者123 更新时间:2023-12-01 08:18:07 26 4
gpt4 key购买 nike

我有一个模块settings.py,它存储了一些供其他模块使用的变量(为了示例起见,我们称它们为brightness饱和,尽管实际的模块有更多,并且它们的初始化要复杂得多)。

此模块由其他模块导入,以便它们可以在自己的代码中使用 settings.brightnesssettings.saturation。但是,这两个变量未初始化,而是在导入 settings 时设置为 None。它们必须通过调用 settings.init() 至少一次来初始化。 (为什么不通过将 init() 放在 settings.py 的末尾来自动初始化它们?这是有原因的......本质上,我必须先做一些其他事情。 )

无论如何,如果在调用 init() 之前访问 brightnesscontrast,我希望能够引发异常。我正在考虑在导入 settings 时使用某种对象而不是 None (这会在访问时引发异常),但我想不出办法来实现这一点,我也不认为这会是一个好的设计。如有任何帮助,我们将不胜感激!

最佳答案

was thinking about using some kind of object instead of None when settings is imported (which would raise an exception upon being accessed)

这不是它的工作原理...“访问”对象是通过在其容器对象上查找该对象的名称来完成的(通过 object.__getattribute__() ,这是“点”运算符的实现),因此只有容器可以检测“访问”。在您的情况下,容器是一个模块,因此您不能覆盖 __getattribute__

这里可能的解决方案是强制客户端代码使用函数来获取值(这是非常不切实际的),或者 - 正如 pasupati 所解释的 - 将整个事物包装到自定义类中并使用属性来控制访问。您最终可能会使此类成为单例......

注意:

Because the Settings class would have to be assigned to some variable before being used. If the module name is settings and, say, it assigns settings = Settings() at the end, then, in order to reference this object, other modules would have to call settings.settings.get_brightness(). from settings import settings is another option, but that would be counterintuitive

没有人强制您将模块命名为 settings.py ;-)

Django 正在做类似的事情(将设置包装在自定义类实例中),并且要从中导入的模块名为“django.conf”,因此您可以这样做 from django.conf import settings .

关于python - 如果变量在被另一个函数访问 "initialized"之前被访问,则引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54860035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com