Повторное использование набора аргументов функции 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
ОБНОВЛЕНИЕ: ответ @Raymond Hettinger определенно был «наиболее полезным в поиске решения» (как говорится во всплывающей подсказке с галочкой), поэтому это определенно принятый ответ. Я опирался на это, чтобы опубликовать еще один ответ с моим окончательным решением и окончательным вариантом использования, который сохраняет метаданные, использует методы (внутри класса), а не функции верхнего уровня, и применяет его к readthedocs и sphinx. Спасибо всем за помощь!

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

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

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

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

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

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