如何在Python中隐式地将变量传递给导入的函数?

时间:2018-01-24 22:17:07

标签: python python-3.6 implicit

module1定义function1function2module2使用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')

3 个答案:

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

这样,您可以根据需要设置多个上下文。