Рассмотрим функцию с сигнатурой f(a, b)
. В будущем я хотел бы изменить сигнатуру на f(a, *, b)
, запретив передачу b в качестве позиционного аргумента. Чтобы уменьшить влияние изменений, я хочу сначала отказаться от позиционирования b, предупреждая пользователей, которые это делают.
Для этого я хотел бы написать что-то вроде:
def f(a, b):
frame = inspect.currentframe()
if b in frame.specified_as_positional:
print('Do not do that')
else:
print('Good')
Результатом будет то, что
>>> f(1, 2)
'Do not do that'
>>> f(1, b=2)
'Good'
inspect.getargvalues(frame)
не представляется достаточным. Объект ArgInfo просто обеспечивает
>>> f(1,b=2)
ArgInfo(args=['a', 'b'], varargs=None, keywords=None, locals={'a': 1, 'b': 2})
Возможна ли такая проверка даже в Python? Концептуально интерпретатору не требуется запоминать, был ли аргумент задан позиционно или как ключевое слово.
Было бы неплохо иметь поддержку Python 2, но это не обязательно.