带参数的可调用模块

时间:2018-08-30 23:14:31

标签: python module

是否可以通过参数调用模块?

我试图按照问题及其答案Callable modules,在Python上制作一个可调用的模块,像这样:

  

foo.py

import sys

class foo(object):
  def __call__(self):
    return 'callable'

sys.modules[__name__] = foo()

然后我称之为:

import foo

print(foo()) # 'callable'

但是我的目标是在可调用模块中传递参数:

print(foo('parameter'))

任何想法我该如何完成?

1 个答案:

答案 0 :(得分:0)

您创建的类没有什么特别的(它甚至不是ModuleType子类),因此它的__call__方法也没有什么特别。如果要使用参数调用它,只需将参数添加到__call__定义中:

import sys

class foo(object):
  def __call__(self, x):
    return f'callable, and called with {x}'

sys.modules[__name__] = foo()

现在,您可以像其他所有可调用对象一样为它传递一个参数:

import foo

print(foo('hello'))

还有the output is

callable, and called with hello

您已从评论中尝试这样做:

def __call__(a, self):
    return a

但是,像Python中的所有方法一样,__call__希望self排在第一位。它不关心名称(除非您使用关键字参数调用它),只关心顺序:第一个参数获取接收者(foo中的foo('hello')),即使您调用了该参数a,即使您调用了该参数'hello',第二个参数也将获得第一个普通参数(self)。

因此,您将模块foo作为第一个参数a传递给您,而您return a则返回foo

这就是为什么你得到这个:

<sta.foo object at 0x10faee6a0>

这不是错误,它是打印未定义__repr____str__的类的实例时获得的完全有效的输出。