在没有init的情况下在项目中的文件之间传递变量

时间:2018-03-04 15:18:11

标签: python global-variables python-import

在Python中是如何将变量初始化一次,然后将其导入剩余的模块中的?

我有以下python项目结构:

  • API
    • V1
      • init.py
    • V2
      • init.py
    • init.py
  • logging.py

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,但我正在寻找更好的方法。

由于

2 个答案:

答案 0 :(得分:0)

首先,我认为你拼错了init.py,如果它是__init__.py

使用变量在模块之间传递数据是不好的编程风格。您应该使用类或函数来处理共享数据。通过这种方式,您可以使用API​​,并且很清楚其他模块可以修改哪些变量。

但是对于你的问题:我(实际上没有)用data.py字典创建一个模块shared = {}。从其他模块,只需导入我就可以共享数据。通过查看变量或仅标记moduleA_initialized,您可以决定是否需要初始化模块。

另外,您可以直接写入globals()字典。注意:这是更糟糕的编程习惯,您应该仔细检查名称,以便与您可能使用的任何库没有冲突。 gettext写信给它,但这是非常特殊的情况。

答案 1 :(得分:0)

以下是封装sentry变量的一种方法,并确保它始终调用某些内容,而不是访问None

logging.py:

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这一事实也是正确的。