Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串传递给模块";“一次”;_Python_Python 2.7_Python Module - Fatal编程技术网

Python 将字符串传递给模块";“一次”;

Python 将字符串传递给模块";“一次”;,python,python-2.7,python-module,Python,Python 2.7,Python Module,我的问题很简单:我只需要向模块传递一次字符串(路径和文件名),该模块中的函数就可以使用。换句话说,函数需要一个路径(和文件名)才能工作,每次调用函数时都传递该字符串是不实际的 是否有一种方法可以将字符串传递一次(可能以后在脚本中更改),并以某种方式保存在模块中供以后使用?您只需在模块中设置一个全局值: variable_to_use = None def funcA(): if variable_to_use is None: raise ValueError('You

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


是否有一种方法可以将字符串传递一次(可能以后在脚本中更改),并以某种方式保存在模块中供以后使用?

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

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)
变量_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

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

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

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

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

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的代码中。

您可以使用某种“init_module()”函数在模块中设置共享变量这正是我所做的!我使用了一个全局路径字符串,并将其作为参数传递给我的函数。@MalikBrahimi:不,你没有。您可以设置函数默认值。这不是一回事。请看@MalikBrahimi:测试您的代码,您会发现它不是那样工作的。定义功能时,例如导入模块时,
arg
默认值设置一次。然后,您不能更改
路径
,并期望这些默认值也会随之更改,因为它们不会被再次设置。谢谢,这正是我所需要的。实际上,我不知道一个变量在模块中是一个全局变量。