这可能是一个非常简单的,但我不知道什么是“正确”的答案。假设我有一个脚本
import utils
bar = 1
utils.foo()
print bar
此外,模块utils
是:
def foo():
bar = bar+1
如上所述,我显然得到:
UnboundLocalError: local variable 'bar' referenced before assignment
如何在bar
内使用foo()
?在我的具体情况下,我真的不想改变foo
,但我 需要能够在foo()
内使用它及其状态。
一种解决方法是将bar
传递给foo()
:
def foo(bar):
return bar+1
并替换脚本中的第三行:bar = utils.foo(bar)
。
但是,这感觉就像一个麻烦的解决方案;特别是如果bar是一个复杂的对象。
我对上述案例的最佳实践方法感兴趣。
答案 0 :(得分:0)
为什么不想改变foo?如果导入模块,则要使用其功能。如果foo函数没有参数,则其中的bar或其他变量将用于模块utils本身。如果要使用值不在模块内的函数,则:
def foo(bar):
return bar+1
完全可以接受。
编辑: //当你创建类foo1时,只需在构造函数中设置bar。 class foo1: def init (自我,栏): self.bar = bar
想象一下这种情况:
import someModule
# now you want to use a function of this module
foo()
也许会出现如下错误:bar未定义或其他 - >模块没有松散耦合。使用参数(完全可以接受)建议函数foo,或者通过构造函数或setBar方法设置条形值。
答案 1 :(得分:0)
我对上述案例的最佳实践方法感兴趣
如您所述,bar
是foo
的参数,将参数传递给函数的最佳实践方法是将其作为参数传递给函数。
utils.py
中的:
def foo(bar):
return bar+1
在你的另一个剧本中:
import utils
bar = 1
bar = utils.foo(bar)
print bar
这是最佳做法。它遵循正确的语义。它也是可测试的:
import unittest
import utils
class MyTest(unittest.TestCase):
def setUp(self):
self.bar = 1
def test_bar(self):
self.assertEquals(2, utils.foo(self.bar))