S
Я создал код функции с таким параметром, оно не сломалось
Я передал этот параметр в функцию, оно не сломалось
Я вызвал
help()
, оно не сломалосьИ когда я вызываю
inspect.signature
, оно не должно ломатьсяSize: a a a
S
help()
, оно не сломалосьinspect.signature
, оно не должно ломатьсяEM
help()
, оно не сломалосьinspect.signature
, оно не должно ломатьсяБ
Б
def f():
print(sum(locals().values()))
f.__code__ = f.__code__.replace(
co_nlocals=2,
co_argcount=2,
co_varnames=('@', '&',)
)
f(**{'@': 1, '&': 2}) # 3
S
locals
по определению - это имена переменных и аргументов внутри функции. co_varnames
- то же самое, только у inspect
. В конце концов, тебе имя co_varnames
говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.Б
locals
по определению - это имена переменных и аргументов внутри функции. co_varnames
- то же самое, только у inspect
. В конце концов, тебе имя co_varnames
говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.co_varnames
это не то же самое)S
Б
Б
locals
по определению - это имена переменных и аргументов внутри функции. co_varnames
- то же самое, только у inspect
. В конце концов, тебе имя co_varnames
говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.S
def f():
print(sum(locals().values()))
f.__code__ = f.__code__.replace(
co_nlocals=2,
co_argcount=2,
co_varnames=('@', '&',)
)
f(**{'@': 1, '&': 2}) # 3
kwargs
или вообще передавать словарь как extra_data
.Б
kwargs
или вообще передавать словарь как extra_data
.Б
S
locals
и в co_varnames
должны быть валидные имена, потому что этого требует их семантика. То, что сейчас в каких-то случаях туда можно передать шлак и оно не падает - это не доказательство того, что оно должно работать всегда. И то, что inspect.signature
падает - это правильно.Б
inspect.signature
какое-то своё видение на то, как должна выглядеть функция, которое отличается от реализации самой функции в питонеБ
locals
и в co_varnames
должны быть валидные имена, потому что этого требует их семантика. То, что сейчас в каких-то случаях туда можно передать шлак и оно не падает - это не доказательство того, что оно должно работать всегда. И то, что inspect.signature
падает - это правильно.inspect
Б
S
inspect.signature
какое-то своё видение на то, как должна выглядеть функция, которое отличается от реализации самой функции в питонеsignature
ничего отличного от того, как Python видит функции синтаксически. Если на то пошло, то проблема была на этапе .replace
, когда ты в co_varnames
кладёшь невалидный идентификатор, но там это, скорее всего, обусловлено тем, что это NamedTuple
, а не какой-нибудь его подкласс, который делает обширную валидацию.Б
signature
ничего отличного от того, как Python видит функции синтаксически. Если на то пошло, то проблема была на этапе .replace
, когда ты в co_varnames
кладёшь невалидный идентификатор, но там это, скорее всего, обусловлено тем, что это NamedTuple
, а не какой-нибудь его подкласс, который делает обширную валидацию.Б
signature
ничего отличного от того, как Python видит функции синтаксически. Если на то пошло, то проблема была на этапе .replace
, когда ты в co_varnames
кладёшь невалидный идентификатор, но там это, скорее всего, обусловлено тем, что это NamedTuple
, а не какой-нибудь его подкласс, который делает обширную валидацию.def f(): ...
f.__code__ = f.__code__.replace(
co_argcount=2,
co_varnames=()
)
Traceback (most recent call last):
File "/Users/arseny.boikov/Library/Preferences/PyCharm2019.3/scratches/scratch_15.py", line 4, in <module>
f.__code__ = f.__code__.replace(
ValueError: code: varnames is too small
Б