在python中,如何从导入模块中定义的函数中使用/操作脚本中定义的对象?

时间:2015-01-05 13:41:17

标签: python

这可能是一个非常简单的,但我不知道什么是“正确”的答案。假设我有一个脚本

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是一个复杂的对象。

我对上述案例的最佳实践方法感兴趣。

2 个答案:

答案 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)

  

我对上述案例的最佳实践方法感兴趣

如您所述,barfoo的参数,将参数传递给函数的最佳实践方法是将其作为参数传递给函数。

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))