Получить внутреннюю функцию kwargs

Если у меня есть функция python, например:

def some_func(arg1, arg2, arg3=1, arg4=2): 

Есть ли способ определить, какие аргументы были переданы по ключевому слову изнутри функции?

РЕДАКТИРОВАТЬ

Для тех, кто спрашивает, зачем я нуждаюсь в этом, у меня нет настоящей причины, он пришел в разговор, и любопытство стало лучше меня.

Нет, нет способа сделать это в коде Python с этой сигнатурой – если вам нужна эта информация, вам нужно изменить подпись функции.

Если вы посмотрите на API Python C, вы увидите, что аргументы фактического пути передаются в обычную функцию Python всегда в виде кортежа плюс dict – то есть, как это прямое отражение сигнатуры *args, **kwargs . Затем этот кортеж и dict разбираются в определенные позиционные аргументы и те, которые названы в подписи, даже если они были переданы по имени, а *a и **kw , если они есть, принимают только «переполнение» от этого разбора, если any – только в этот момент ваш код Python получает контроль, и к тому времени информация, которую вы запрашиваете ( как проходили различные аргументы), уже не существует.

Поэтому, чтобы получить запрошенную вами информацию, измените подпись на *a, **kw и выполните собственный анализ / проверку – это происходит «от яйца до омлета», т. Е. Определенная работа, но, безусловно, возможно, в то время как то, что вы ищете, будет «от омлета обратно к яйцу» … просто не выполнимо ;-).

Вот мое решение через декораторы:

 def showargs(function): def inner(*args, **kwargs): return function((args, kwargs), *args, **kwargs) return inner @showargs def some_func(info, arg1, arg2, arg3=1, arg4=2): print arg1,arg2,arg3,arg4 return info In [226]: some_func(1,2,3, arg4=4) 1 2 3 4 Out[226]: ((1, 2, 3), {'arg4': 4}) 

Там может быть способ очистить это дальше, но это кажется минимально навязчивым для меня и не требует изменения кода вызова.

Изменить: Чтобы проверить, были ли определенные аргументы переданы по ключевому слову, выполните следующие действия внутри some_func:

 args, kwargs = info if 'arg4' in kwargs: print "arg4 passed as keyword argument" 

Отказ от ответственности: вам, вероятно, следует подумать, действительно ли вы заботитесь о том, как передавались аргументы. Весь этот подход может оказаться ненужным.

Вы в значительной степени должны будете переопределить свою функцию:

 def some_func(*args, **kwargs): 

и делайте маршалинг самостоятельно. Невозможно определить разницу между пошаговым положением, по-ключевому слову и значением по умолчанию.

Просто сделайте это так:

 def some_func ( arg1, arg2, arg3=None, arg4=None ): if arg3 is None: arg3 = 1 # default value if arg4 is None: arg4 = 2 # default value # do something 

Таким образом, вы можете видеть, когда что-то было установлено, и вы также можете работать с более сложными структурами по умолчанию (например, списки), не сталкиваясь с такими проблемами:

 >>> def test( arg=[] ): arg.append( 1 ) print( arg ) >>> test() [1] >>> test() [1, 1] 

вы хотите знать, был ли arg3 1 потому что он был передан извне или потому, что он был значением по умолчанию? Нет, я не знаю, как это сделать. Основная причина, я подозреваю, что нет необходимости в таких знаниях. Что обычно делается, так это следующее:

 >>> def func(a, b=None): if b is None: # here we know that function was called as: # func('spam') or func('spam', None) or func('spam', b=None) or func(a='spam', b=None) b = 42