python - 带参数的可调用模块
问题描述
是否可以使用参数使模块可调用?
我正在尝试在 Python 上创建一个可调用模块,遵循问题及其答案Callable modules,如下所示:
foo.py
import sys
class foo(object):
def __call__(self):
return 'callable'
sys.modules[__name__] = foo()
然后我称之为:
import foo
print(foo()) # 'callable'
但我的目标是在可调用模块中传递一个参数:
print(foo('parameter'))
任何想法我怎么能做到这一点?
解决方案
您创建的类没有什么特别之处(它甚至不是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'))
输出是:
callable, and called with hello
从评论中,您尝试这样做:
def __call__(a, self):
return a
但是,就像 Python 中的所有方法一样,它__call__
想要排self
在第一位。它不关心名称(除非你用关键字参数调用它),只关心顺序:第一个参数获取接收者(foo
in foo('hello')
),即使你调用了那个参数a
,第二个参数获取第一个普通参数(the 'hello'
),即使你调用了那个参数self
。
因此,您将模块foo
作为第一个参数传递a
,而 youreturn a
则返回foo
.
这就是你得到这个的原因:
<sta.foo object at 0x10faee6a0>
这不是错误,这是当您打印出未定义__repr__
或的类的实例时得到的完全有效的输出__str__
。
推荐阅读
- angular - Angular:“AppRoutingModule”被忽略并且路由不起作用
- python - Resty解析器问题Python
- node.js - 在 node js 中声明 var 的正确方法是什么?
- php - 使用多维数组中的值重新索引数组
- android - RecyclerView中的Android DataBinding项目位置
- sql - MS Access:从 SQL 传递组合框值
- visual-studio-2013 - 如何引用 Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.Properties;
- typescript - 如何在 Puppeteer with Jest 中使用 page.evaluate 中的导入函数?
- javascript - Javascript 性能和比较对象与对象的属性
- ajax - 使用 ajax 运行控制器 PHP codeigniter 函数