在Python中是如何将变量初始化一次,然后将其导入剩余的模块中的?
我有以下python项目结构:
logging.py:
which(!is.na(x))
API /的初始化的.py
[1] 1 2 4
API / {V1,V2} /的初始化的.py
from raven import Client
sentry = None
def init_sentry():
global sentry
sentry = 'some_dsn'
在文件api / v1 / init .py和api / v2 / init .py中,在iftry变量上获取错误NoneType。我知道我在使用它时可以在所有文件中调用init_sentry,但我正在寻找更好的方法。
由于
答案 0 :(得分:0)
首先,我认为你拼错了init.py
,如果它是__init__.py
。
使用变量在模块之间传递数据是不好的编程风格。您应该使用类或函数来处理共享数据。通过这种方式,您可以使用API,并且很清楚其他模块可以修改哪些变量。
但是对于你的问题:我(实际上没有)用data.py
字典创建一个模块shared = {}
。从其他模块,只需导入我就可以共享数据。通过查看变量或仅标记moduleA_initialized
,您可以决定是否需要初始化模块。
另外,您可以直接写入globals()
字典。注意:这是更糟糕的编程习惯,您应该仔细检查名称,以便与您可能使用的任何库没有冲突。 gettext
写信给它,但这是非常特殊的情况。
答案 1 :(得分:0)
以下是封装sentry
变量的一种方法,并确保它始终调用某些内容,而不是访问None
:
class Sentry(object):
_dsn = None
@classmethod
def _set_dsn(cls, dsn):
cls._dsn = dsn
@classmethod
def __getattr__(cls, item):
return getattr(cls._dsn)
sentry = Sentry
def init_sentry():
Sentry._set_dsn('some_dsn')
This answer对于您可能希望__init__.py
不是init.py
这一事实也是正确的。