将字符串传递给模块"一次"

时间:2015-02-17 20:49:22

标签: python python-2.7 python-module

我的问题很简单:我只需要将一个字符串(路径和文件名)只传递给一个模块,以便该模块中的函数可以使用。换句话说,函数需要一个路径(和文件名)才能工作,每次调用函数时传递该字符串都是不切实际的。

有没有一种方法可以实际传递一次字符串(可能会在以后的脚本中更改它)并将其保存在模块中以供以后使用?

3 个答案:

答案 0 :(得分:4)

您只需在模块中设置全局:

variable_to_use = None

def funcA():
    if variable_to_use is None:
        raise ValueError('You need to set module.variable_to_use before using this function')
    do_something_with(variable_to_use)

variable_to_use对模块中的所有代码都是全局的。其他代码可以这样做:

import module_name

module_name.variable_to_use = 'some value to be used'

不要试图使用from module_name import variable_to_use,因为它会创建一个本地引用,然后反弹,使模块全局不变。

您可以在函数中封装全局设置:

def set_variable_to_use(value):
    global variable_to_use
    variable_to_use = value

并使用该函数而不是直接设置模块全局。

答案 1 :(得分:2)

一个选项是将函数添加到类中,并使用对象实例来保存不同的可重用值。

class Foo():
    def __init__(self, fpath, fname):
        self.fpath = fpath
        self.fname = fname

    def funcA(self):
        print "do something with the path: {}".format(self.fpath)

    def funcB(self):
        print "do something with the filename: {}".format(self.fname)

if __name__ == '__main__':
    my_object = Foo("/some/path/", "some_filename")
    my_object.funcA()
    my_object.funcB()

答案 2 :(得分:1)

您可以为模块添加设置功能,例如

import functools

_path = None

def setup(path):
    global _path
    _path = path

def setup_required(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        global _path
        if _path is None:
            raise RuntimeError('setup required')
        return func(*args, **kwargs)
    return wrapped

@setup_required
def foo(...):
    with open(_path) as f:
        ....

@setup_required
def bar(...):
    ...

最好包装依赖于类中路径的函数,并将配置的对象作为依赖项注入到使用要从模块公开的API的代码中。