Можно ли изменить функцию в python?

Я видел примеры для установки метода __repr__ в определениях классов. Можно ли изменить функции __repr__ для функций либо в их определениях, либо после их определения?

Я попытался без успеха …

  • Запустите функцию PowerShell из скрипта Python
  • Поиск уникальных столбцов и столбцов
  • python преобразует строку в оператор
  • Передать дескриптор файла функции cython
  • Программа Python не выполняется за пределами первого пользовательского ввода
  • Вызов функции из строки внутри одного модуля в Python?
  •  >>> def f(): pass >>> f <function f at 0x1026730c8> >>> f.__repr__ = lambda: '<New repr>' >>> f <function __main__.f> 

  • Словарь доступа Python: производные классы базового класса в том же месте памяти
  • Прокси в приложении FTP Python
  • Как вы запускаете приложение Twisted через Python (а не через Twisted)?
  • readlines дает мне дополнительные разрывы строк python2.6.5
  • Python: найти в списке
  • Как получить «id» после INSERT в базе данных MySQL с помощью Python?
  • 3 Solutions collect form web for “Можно ли изменить функцию в python?”

    Да, если вы хотите отказаться от функции, фактически являющейся функцией.

    Сначала определите класс для нового типа:

     import functools class reprwrapper(object): def __init__(self, repr, func): self._repr = repr self._func = func functools.update_wrapper(self, func) def __call__(self, *args, **kw): return self._func(*args, **kw) def __repr__(self): return self._repr(self._func) 

    Добавить в функцию декоратора:

     def withrepr(reprfun): def _wrap(func): return reprwrapper(reprfun, func) return _wrap 

    И теперь мы можем определить репер вместе с функцией:

     @withrepr(lambda x: "<Func: %s>" % x.__name__) def mul42(y): return y*42 

    Теперь repr(mul42) производит '<Func: mul42>'

    Нет, потому что repr(f) выполняется как type(f).__repr__(f) .

    Для этого вам нужно будет изменить функцию __repr__ для данного класса, которая в этом случае является встроенным классом функций ( types.FunctionType ). Поскольку в Python вы не можете редактировать встроенные классы, только подклассировать их, вы не можете.

    Однако есть два подхода, которым вы могли бы следовать:

    1. Оберните некоторые функции, предложенные Кватфордом
    2. Создайте свой собственный протокол представления с помощью собственной функции репрезентации. Например, вы можете определить функцию __myrepr__ , которая сначала __myrepr__ методы __myrepr__ , которую вы не можете добавить в класс функций, но вы можете добавить ее к отдельным функциональным объектам, как вы предлагаете (а также к вашим пользовательским классам и объектам), а затем по умолчанию если __myrepr__ не найден. Возможной реализацией этого может быть:

       def myrepr(x): try: x.__myrepr__ except AttributeError: return repr(x) else: return x.__myrepr__() 

      Затем вы можете определить методы __myrepr__ и использовать функцию myrepr . В качестве альтернативы вы также можете сделать __builtins__.repr = myrepr чтобы сделать вашу функцию по умолчанию repr и продолжать использовать repr . Этот подход в конечном итоге сделает именно то, что вы хотите, хотя редактирование __builtins__ может не всегда быть желательным.

    Python - лучший язык программирования в мире.