Немного приятнее, чем прямая проверка объекта кода и разработка переменных, - использовать модуль проверки.
>>> import inspect
>>> def func(a,b,c=42, *args, **kwargs): pass
>>> inspect.getargspec(func)
(['a', 'b', 'c'], 'args', 'kwargs', (42,))
Если вы хотите знать, может ли он вызываться с определенным набором аргументов, вам нужны аргументы без указания по умолчанию. Их можно получить:
def getRequiredArgs(func):
args, varargs, varkw, defaults = inspect.getargspec(func)
if defaults:
args = args[:-len(defaults)]
return args # *args and **kwargs are not required, so ignore them.
Тогда функция для определения того, чего вам не хватает в вашем конкретном слове:
def missingArgs(func, argdict):
return set(getRequiredArgs(func)).difference(argdict)
Аналогично, чтобы проверить наличие недействительных аргументов, используйте:
def invalidArgs(func, argdict):
args, varargs, varkw, defaults = inspect.getargspec(func)
if varkw: return set() # All accepted
return set(argdict) - set(args)
Итак, полный тест, который можно вызвать:
def isCallableWithArgs(func, argdict):
return not missingArgs(func, argdict) and not invalidArgs(func, argdict)
(Это хорошо только при разборе аргументов в python. Любая проверка во время выполнения на недопустимые значения в kwargs, очевидно, не может быть обнаружена.)