Не делай этого.Если вы не уверены, нужно ли вам это, вы этого не делаете.Создание вызываемого модуля - это действительно странная вещь.Тем не менее, это интересное интеллектуальное любопытство, поэтому ...
Это можно сделать, используя тот факт, что модуль сам является объектом, и что объект может быть вызван, если его класс имеет__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!