Повторное использование подписи функции Python с вариациямиPython

Программы на Python
Ответить
Anonymous
 Повторное использование подписи функции Python с вариациями

Сообщение Anonymous »

У меня есть две функции со 100% идентичными (и длинными) сигнатурами, но с небольшими различиями во внутреннем коде.
Я хотел бы использовать природу функций первого класса для повторного использования сигнатуры, а затем использовать имя вызываемой функции для выполнения некоторого условного ветвления внутри общего кода.
Какой наиболее питонический способ добиться этого?
Я пробовал несколько разных документированные варианты получения имени текущей функции изнутри функции, но ни один из них не получит имя вызываемой функции, т. е. f1 против f2 в этом примере:
import inspect

def commonFuncCore(a=None,b=None,c=3):
# print(f'funcName:{commonFuncCore.__name__} a:{a} b:{b} c:{c}')
# print(f'funcName:{commonFuncCore.__qualname__} a:{a} b:{b} c:{c}')
print(f'funcName:{inspect.currentframe().f_code.co_name} a:{a} b:{b} c:{c}')

f1=commonFuncCore
f2=commonFuncCore

print('calling f1:')
f1()
print('calling f2:')
f2()

Лучше ли добавить аргумент, указывающий жестко закодированное имя функции? Следующий код дает желаемый результат. Есть ли лучший способ?
def commonFuncCore(a=None,b=None,c=3,funcName='COMMON'):
# print(f'funcName:{commonFuncCore.__name__} a:{a} b:{b} c:{c}')
# print(f'funcName:{commonFuncCore.__qualname__} a:{a} b:{b} c:{c}')
# print(f'funcName:{inspect.currentframe().f_code.co_name} a:{a} b:{b} c:{c}')
print(f'funcName:{funcName} a:{a} b:{b} c:{c}')

# f1=commonFuncCore
# f2=commonFuncCore

def f1(*args,**kwargs):
commonFuncCore(*args,**kwargs,funcName='f1')

def f2(*args,**kwargs):
commonFuncCore(*args,**kwargs,funcName='f2')

print('calling f1:')
f1(a=1,b=2,c=5)
print('calling f2:')
f2()

что дает желаемый результат:

calling f1:
funcName:f1 a:1 b:2 c:5
calling f2:
funcName:f2 a:None b:None c:3


Подробнее здесь: https://stackoverflow.com/questions/798 ... variations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»