Когда вы вызываете функцию с неправильным числом аргументов или с аргументом ключевого слова, который не находится в его определении, вы получаете TypeError. Я хотел бы, чтобы часть кода выполняла обратный вызов и вызывала его с переменными аргументами, основанными на том, что поддерживает обратный вызов. Один из способов сделать это - обратиться за обратным вызовом cb
, использовать cb.__code__.cb_argcount
и cb.__code__.co_varnames
, но я бы скорее отвлекся на что-то вроде apply
, но это применимо только к аргументам, которые «подходят».Есть ли способ вызвать функцию Python с неправильным количеством аргументов без вызова TypeError?
Например:
def foo(x,y,z):
pass
cleanvoke(foo, 1) # should call foo(1, None, None)
cleanvoke(foo, y=2) # should call foo(None, 2, None)
cleanvoke(foo, 1,2,3,4,5) # should call foo(1, 2, 3)
# etc.
Есть ли что-нибудь, как это уже в Python, или это то, что я должен написать с нуля?
getargspec, безусловно, сделает это намного более «чистые» в том, что беспокоило меня (не надо смотреть через __magic__ материал , например). Я намерен фильтровать названные args, как вы предложили (без «k» вместо «a» typo;)), и нормальные аргументы по длине - заполнить None, если в вызове недостаточно аргументов, и обрезать лишние аргументы. Возможно, я тоже сделаю это в декораторе :) –
С другой стороны, вы абсолютно правы, что я не очень ясно (в своей голове тоже), как я хочу, чтобы это было, когда обратный вызов имеет разные комбинации значений по умолчанию, * args и ** kwargs ... –
Хех, спасибо, исправил опечатку. Подумав об этом больше, я уверен, что сосредоточиться на названных args - хорошая идея - смешение позиционного и названного всегда суетливо. Одним из ключевых улучшений для моего кода было бы: если аргумент a имеет значение по умолчанию и не находится в d, пусть он один, а не принуждает его к None, как мой код (через .get). –