社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

jesse • 6 年前 • 1831 次点击  

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

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

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
 
1831 次点击  
文章 [ 2 ]  |  最新文章 6 年前
gmds
Reply   •   1 楼
gmds    6 年前

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

可以这样做,利用这样一个事实:一个模块本身就是一个对象,如果一个对象的类具有 __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    6 年前

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

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

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

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

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