Вызываемые модули с параметрами - PullRequest
0 голосов
/ 31 августа 2018

Можно ли сделать модуль вызываемым с параметрами?

Я пытаюсь создать вызываемый модуль на Python, следуя вопросу и ответам на него Вызываемые модули , вот так:

foo.py

import sys

class foo(object):
  def __call__(self):
    return 'callable'

sys.modules[__name__] = foo()

тогда я называю это:

import foo

print(foo()) # 'callable'

но моя цель - передать параметр в вызываемый модуль:

print(foo('parameter'))

Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 31 августа 2018

Нет ничего особенного в классе, который вы создали (это даже не подкласс 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, и второй параметр получает первый нормальный аргумент ('hello'), даже если вы назвали этот параметр self.

Итак, вы передаете модуль foo в качестве первого параметра, a, а вы return a, поэтому он возвращает foo.

Вот почему вы получили это:

<sta.foo object at 0x10faee6a0>

Это не ошибка, это совершенно правильный вывод, который вы получаете, когда вы распечатываете экземпляр класса, который не определяет __repr__ или __str__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...