如果在另一个函数“初始化”之前访问变量,则引发异常

时间:2019-02-25 05:32:44

标签: python python-3.x

我有一个模块settings.py,其中存储了一些其他模块要使用的变量(为了便于示例,我们将它们称为brightnesssaturation,尽管实际的模块还有很多,而且它们的初始化要复杂得多。

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

无论如何,如果在调用brightness之前访问了contrastinit(),我想能够引发一个异常。我正在考虑在导入None时使用某种对象而不是settings(这将在访问时引发异常),但是我想不出一种方法来实现,也没有我认为那将是一个好的设计。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

  

正在考虑在导入设置时使用某种对象而非“无”(在访问时会引发异常

这不是它的工作原理...通过在其容器对象上查找该对象的名称来“访问”该对象(通过id lucky_number 0 10 1 20 5 60 4 50 3 40 2 30 ,它是'dot'运算符的实现),因此只有容器可以检测到“访问”。在您的情况下,容器是一个模块,因此您无法覆盖object.__getattribute__()

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

NB:

  

因为设置类必须在使用前分配给某个变量。如果模块名称是settings,例如,它在末尾分配settings = Settings(),则为了引用此对象,其他模块将必须调用settings.settings.get_brightness()。 __getattribute__是另一种选择,但这会违反直觉

没有人强迫您将模块命名为from settings import settings;-)

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

答案 1 :(得分:0)

您可以改为使用属性的getter和setter

class setting:
     def __init__(self):
         self.__brightness=None

     @property
     def Brightness(self):
         if(self.__brightness==None):
            raise BaseException("Trying to access a value which is not set")
         else:
            return self.__brightness

     @Brightness.setter
     def Brightness(self,value):
         self.__brightness=value

s = setting()

try:
   s.Brightness
except BaseException as e:
    print(e)

s.Brightness=1
print(s.Brightness)