У меня следующая ситуация:
# Module A.py
def AddThreeNumbers(a, b, c, parent=None):
"""
Add `a + b + c` and return the result.
If `parent` is supplied, additionally store
the result in `parent.result`.
`parent` is optional, so we don't want it
to be the first argument when this is
called as a global function.
"""
result = a + b + c
if parent:
parent.result = result
return result
и:
# Module B.py
class SomeClass:
# ... various methods
pass
try:
import A
except ImportError:
# The `A` module may or may not be available.
pass # If it isn't, no harm no foul, but...
else:
# if module `A` *is* available, then we would
# like to monkey-patch the `SomeClass` class
# so that it has an `AddThreeNumbers` method...
SomeClass.AddThreeNumbers = XXX( A.AddThreeNumbers )
XXX
в последней строке - недостающий фрагмент. Я хочу каким-то образом преобразовать функцию AddThreeNumbers
, чтобы self
передавался как последний аргумент (parent
), а не как первый. Я мог бы, конечно, обернуть это:
SomeClass.AddThreeNumbers = lambda self, a, b, c: A.AddThreeNumbers(a, b, c, parent=self)
... но это имеет два недостатка. Во-первых, я теряю __doc__
(я полагаю, что это можно обойти с помощью functools.wraps
), а во-вторых, я должен поддерживать подпись (имена аргументов a
, b
и c
) в двух местах, если это когда-либо меняется / расширяется.
Есть ли лучший способ?