Python: получение списка аргументов, передаваемых в текущую функцию, с сохранением значений по умолчанию для аргументов Python

Программы на Python
Ответить
Anonymous
 Python: получение списка аргументов, передаваемых в текущую функцию, с сохранением значений по умолчанию для аргументов

Сообщение Anonymous »

Я пишу функцию, внутренняя логика которой должна знать, с какими необязательными аргументами ключевого слова была вызвана функция.
Мне также нужно иметь возможность указывать значения по умолчанию для аргументов ключевых слов.
Если аргумент был указан в вызове, он будет вести себя одним образом; если этот аргумент не был указан в вызове, а вместо этого был взят из значения по умолчанию, он будет использовать значение по умолчанию и вести себя по-другому.
У меня есть работающее решение, но мне интересно, есть ли более чистый, безопасный и краткий способ достижения цели:

Код: Выделить всё

import json

def addFeature(*args,**kwargs):
defaults={
'p1':1,
'p2':2,
'p3':3
}
mergedKwargs = defaults | kwargs # start with defaults; overwrite with any specified kwargs items
print(f'args:{args}')
print('keyword arguments specified in the call to this function:')
print(json.dumps(kwargs,indent=3))
print('mergedKwargs:')
print(json.dumps(mergedKwargs,indent=3))
# unpack to local variables
(p1,p2,p3)=(mergedKwargs[k] for k in ('p1','p2','p3'))
print(f'local values: p1={p1}  p2={p2}  p3={p3}')

addFeature(1,2,p1=5)
addFeature(3,4,p2=7,p3=9)
выполняем этот код:

Код: Выделить всё

PS C:\Users\caver\Documents\GitHub> python argsTest.py
call to addFeature: args: (1, 2)
keyword arguments specified in the call to this function:
{
"p1": 5
}
mergedKwargs:
{
"p1": 5,
"p2": 2,
"p3": 3
}
local values: p1=5  p2=2  p3=3

call to addFeature: args: (3, 4)
keyword arguments specified in the call to this function:
{
"p2": 7,
"p3": 9
}
mergedKwargs:
{
"p1": 1,
"p2": 7,
"p3": 9
}
local values: p1=1  p2=7  p3=9

PS C:\Users\caver\Documents\GitHub>
Одним из недостатков этого метода является то, что сигнатура функции (список возможных аргументов) неизвестна при использовании *args и **kwargs.

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

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

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

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

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

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