Py学习  »  Python

如何将python模块创建为单个可调用函数?

jesse • 7 年前 • 2320 次点击  

我想把模块写成函数而不是类。

有没有办法使这项工作按预期进行?

greet.py
def main(x):
    print(f'Hello {x}!')

现在如何编写模块,以便 greet 执行, main 跑。

main.py
import greet

greet('Foo') # output: Hello Foo!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/33859
文章 [ 2 ]  |  最新文章 7 年前
gmds
Reply   •   1 楼
gmds    7 年前

不要这样做。如果你不确定是否需要这个,你就不需要。让一个模块可调用是一件很奇怪的事情。然而,这是一个有趣的智力好奇心,所以…

可以这样做,利用这样一个事实:一个模块本身就是一个对象,如果一个对象的类具有 __call__ 方法。

然而,一个问题是 module 是内置的,不能修改内置的属性。

因此,最简单的解决方案是创建一个类来代替模块 sys.modules ,但也有一个 阿尔卡拉尔 方法。

greet.py :

import sys

class CallableModule():

    def __init__(self, wrapped):
        self._wrapped = wrapped

    def __call__(self, *args, **kwargs):
        return self._wrapped.main(*args, **kwargs)

    def __getattr__(self, attr):
        return object.__getattribute__(self._wrapped, attr)

sys.modules[__name__] = CallableModule(sys.modules[__name__])

def main(x):
    print(f'Hello {x}!')

来自壳牌:

>>> import greet
>>> greet('there')
Hello there!
Draconis
Reply   •   2 楼
Draconis    7 年前

不幸的是,这是不可能的。

对象、类或函数可以调用,但模块不能调用。

但是,您可以方便地命名:

[greet.py]
def greet(x):
     ...

[main.py]
    from greet import greet
    greet('foo')