Как создать модуль Python как одну вызываемую функцию? - PullRequest
0 голосов
/ 31 мая 2019

Я хотел бы написать модуль как функцию, а не как класс.

Есть ли способ заставить эту работу работать как задумано?

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

Теперь, как мне написать модуль, чтобы при выполнении greet выполнялось main.

main.py
import greet

greet('Foo') # output: Hello Foo!

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Не делай этого.Если вы не уверены, нужно ли вам это, вы этого не делаете.Создание вызываемого модуля - это действительно странная вещь.Тем не менее, это интересное интеллектуальное любопытство, поэтому ...

Это можно сделать, используя тот факт, что модуль сам является объектом, и что объект может быть вызван, если его класс имеет__call__ метод.

Однако одна проблема состоит в том, что module является встроенным, и вы не можете изменять атрибуты встроенного.

Поэтому самое простое решение - это создатькласс, который займет место модуля в sys.modules, но также имеет метод __call__.

В 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!
0 голосов
/ 31 мая 2019

К сожалению, это невозможно.

Объект, класс или функция могут быть вызваны, но модуль не может.

Однако вы можете удобно называть вещи:

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

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