将字符串传递给模块 "once"
Passing a string to module "once"
我的问题很简单:我只需要向模块传递一次字符串(路径和文件名),供该模块中的函数使用。换句话说,函数需要一个路径(和文件名)才能工作,每次调用函数时都传递该字符串是不切实际的。
有没有一种方法可以让我真正传递一次字符串(也许稍后在脚本中更改它)并以某种方式将其保存在模块中供以后使用?
您可以简单地在模块中设置一个全局变量:
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
并使用该函数而不是直接将模块设置为全局。
一种选择是将函数添加到 class,并使用对象实例来保存不同的可重用值。
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(...):
...
不过,最好将依赖于路径的函数包装在 class 中,并将配置的对象作为依赖项注入到使用要从中公开的 api 的代码中模块。
我的问题很简单:我只需要向模块传递一次字符串(路径和文件名),供该模块中的函数使用。换句话说,函数需要一个路径(和文件名)才能工作,每次调用函数时都传递该字符串是不切实际的。
有没有一种方法可以让我真正传递一次字符串(也许稍后在脚本中更改它)并以某种方式将其保存在模块中供以后使用?
您可以简单地在模块中设置一个全局变量:
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
并使用该函数而不是直接将模块设置为全局。
一种选择是将函数添加到 class,并使用对象实例来保存不同的可重用值。
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(...):
...
不过,最好将依赖于路径的函数包装在 class 中,并将配置的对象作为依赖项注入到使用要从中公开的 api 的代码中模块。