【问题标题】:Store state in between module function calls在模块函数调用之间存储状态
【发布时间】:2017-08-08 15:17:32
【问题描述】:

我有以下结构:

app/
  test1.py
  test/
   __init__.py
   test2.py

我在test1.py 中导入test2.py 并使用来自test2.py 的函数

代码如下:

test1.py:

import test.test2 as T


T.hello()
...
T.hello1()

test2.py:

d = {}
def hello():
    print('hi')
    global d
    d['1'] = 1


def hello1():
    print('hi1')
    global d
    print(d) # prints{'1': 1} 

test1.py 将调用hello 并在一段时间后调用hello1。我想在hello 中填充dict d 并在hello1 中使用它。使用global 可以正常工作,但有什么更好的方法可以做到这一点,因为我想避免使用globals。我不想将dhello 传递到test1 中的caller,然后从那里返回到hello1

我可以做些什么来避免globals。我正在使用python 3.5

【问题讨论】:

  • 你有什么理由避免将两个 hello 函数放在一个类中吗?对于具有实例变量 self.d 的类来说,两个具有共享状态的函数似乎是一个明显的用例。
  • test1.py 文件将被进一步导入(与我用于简化的结构相反)所以我还必须在test1.py 中添加一个类,我想知道是否有还有什么办法吗?

标签: python python-3.x function global-variables


【解决方案1】:

你可以只使用一个类:

class Whatever(object):
    def __init__(self):
        self.d = {}

    def hello(self):
        print('hi')
        self.d['1'] = 1

    def hello1(self):
        print('hi1')
        print(self.d)

_Someinstance = Whatever()
hello = _Someinstance.hello
hello1 = _Someinstance.hello1

除了最后三行之外,您还可以在任何需要的地方创建和使用实例。这些只是为了让它表现得(几乎)像你原来的那样。

请注意,函数也是对象,因此您可以将变量分配给 hello 函数:

def hello():
    print('hi')
    hello.d['1'] = 1

def hello1():
    print('hi1')
    print(hello.d) # prints{'1': 1} 

hello.d = {}

【讨论】:

  • test1.py 文件将被进一步导入(与我用于简化的结构相反)所以我必须在test1.py 中添加一个类,这也是我想要的避免。
  • 为什么?如果您完全使用我在回答中使用的代码,它应该几乎像原始代码一样工作。那是因为我添加了hello = _Someinstance.hellohello1 = _Someinstance.hello1 行。如果这不起作用,您需要提供更准确的问题描述:)
  • 如果你不想使用类,你可以让字典成为每个hello函数的函数参数。只需传入在 test1.py 中创建的同一个字典,因为字典是通过引用传递的。
  • @csunday95 是的,我很想使用这种方法。
  • @MSeifert 我同意,我的描述不足以保证我为什么要避免使用类。只是想知道是否有一种理智的方法可以在不使用类的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多