module1
定义function1
和function2
。 module2
使用module1
中定义的2个函数,并且需要传递可以描述为上下文配置参数(实际上是可变自定义类的实例,而不是像字符串一样简陋的东西)给它们,每次在module2
内调用任何这些函数时都是一样的。如果我可以避免使用普通的函数参数方法重复传递它,并且可以只指定一次,那么模块中调用的所有函数(module2
)都能够访问它,我将不胜感激。这在Python中可行吗?我使用最新的Python 3.6。 module1
不是第三方库,也不是已建立的代码库模块,我可以在此阶段以任何必要的方式修改定义。
# --- module1.py ---
class Context:
def __init__(self, s: str):
self.s = s
def function1(cx: Context, s1: str):
print(f'{cx.s} {s1}!')
# --- module2.py ---
from module1 import Context
from module1 import function1
cx = Context('Hello')
# this works and prints 'Hello World!'
function1(cx, 'World')
# this doesn't work but I want it to work and do exactly the same
# (function1 definition can be changed whatever way necessary)
function1('World')
答案 0 :(得分:2)
(编辑以匹配问题中的示例代码)如果您修改函数以使cx
成为关键字参数(或者,最后一个位置参数),这可能是部分的好地方这样:
def function1(s1: str, cx: Context = None):
print(f'{cx.s} {s1}!')
然后你可以这样做:
from module1 import Context
from module1 import function1
from functools import partial
cx = Context('hello')
function1 = partial(function1, cx = cx)
当你致电function1
时,你将调用已经设置了cx
参数的部分。
答案 1 :(得分:2)
一种完全不同的方法,可能是一个可怕的,可怕的想法,但很有趣(并且避免了module2
中的大部分工作):你可以做一个找到{{1在调用者的上下文中,并自动将其提供给函数。像这样:
cx
答案 2 :(得分:1)
你可以使用模块级全局变量来执行此操作。
context = None
def function1(arg1, arg2, arg3):
# do something involving context and args
然后,您只需从导入module1.context = whatever
的地方module1
开始。
但更好的方法是保存对上下文的引用的类,在实例化对象时传入:
class MyFunctions(object):
def __init__(self, context):
self.context = context
def function1(self, arg1, arg2. arg3):
# do something with self.context and args
然后你就这样使用它:
myfunctions = MyFunctions(configuration_object)
myfunctions.function1(1, 2, 3)
这样,您可以根据需要设置多个上下文。