Size: a a a

2020 March 10

S

Stan in PiterPy Meetup
Боброний
Давайте я ещё раз изложу свою позицию:

Я создал код функции с таким параметром, оно не сломалось
Я передал этот параметр в функцию, оно не сломалось
Я вызвал help(), оно не сломалось
И когда я вызываю inspect.signature, оно не должно ломаться
Передай два таких аргумента и верни их сумму, и я ещё раз подумаю)
источник

EM

Egor Molodik in PiterPy Meetup
Боброний
Давайте я ещё раз изложу свою позицию:

Я создал код функции с таким параметром, оно не сломалось
Я передал этот параметр в функцию, оно не сломалось
Я вызвал help(), оно не сломалось
И когда я вызываю inspect.signature, оно не должно ломаться
Не должно согласно чему?
источник

Б

Боброний in PiterPy Meetup
Egor Molodik
Не должно согласно чему?
Моему мнению же
источник

Б

Боброний in PiterPy Meetup
Stan
Передай два таких аргумента и верни их сумму, и я ещё раз подумаю)
Не очень понял, над чем ты хочешь подумать, но вот, держи:

def f():
   print(sum(locals().values()))


f.__code__ = f.__code__.replace(
   co_nlocals=2,
   co_argcount=2,
   co_varnames=('@', '&',)
)

f(**{'@': 1, '&': 2})  # 3
источник

S

Stan in PiterPy Meetup
Ну а я говорю о том, что locals по определению - это имена переменных и аргументов внутри функции. co_varnames - то же самое, только у inspect. В конце концов, тебе имя co_varnames говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.

Если уж на то пошло, я бы сказал, что f(**{"a-b":1}) не должно работать, но тут надо хорошо подумать.
источник

Б

Боброний in PiterPy Meetup
Stan
Ну а я говорю о том, что locals по определению - это имена переменных и аргументов внутри функции. co_varnames - то же самое, только у inspect. В конце концов, тебе имя co_varnames говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.

Если уж на то пошло, я бы сказал, что f(**{"a-b":1}) не должно работать, но тут надо хорошо подумать.
co_varnames это не то же самое)
источник

S

Stan in PiterPy Meetup
Боброний
co_varnames это не то же самое)
мм?
источник

Б

Боброний in PiterPy Meetup
А, да, пардон, то же самое
источник

Б

Боброний in PiterPy Meetup
Stan
Ну а я говорю о том, что locals по определению - это имена переменных и аргументов внутри функции. co_varnames - то же самое, только у inspect. В конце концов, тебе имя co_varnames говорит о том, что это имена переменных :) Соответственно, эти имена должны следовать некоторым правилам.

Если уж на то пошло, я бы сказал, что f(**{"a-b":1}) не должно работать, но тут надо хорошо подумать.
Но тем не менее, оно работает
источник

S

Stan in PiterPy Meetup
Боброний
Не очень понял, над чем ты хочешь подумать, но вот, держи:

def f():
   print(sum(locals().values()))


f.__code__ = f.__code__.replace(
   co_nlocals=2,
   co_argcount=2,
   co_varnames=('@', '&',)
)

f(**{'@': 1, '&': 2})  # 3
Тут ты хитришь) Готов поспорить, если я тебя попрошу написать таким образом функцию с одним аргументом, которая добавит к аргументу "/posts/" и сходит через urlopen по образованному урлу, чтобы забрать оттуда json, ты тоже будешь стучаться по ключу в locals. Но это приводит нас к моему предыдущему сообщению - что мешает тогда пользоваться kwargs или вообще передавать словарь как extra_data.
источник

Б

Боброний in PiterPy Meetup
Stan
Тут ты хитришь) Готов поспорить, если я тебя попрошу написать таким образом функцию с одним аргументом, которая добавит к аргументу "/posts/" и сходит через urlopen по образованному урлу, чтобы забрать оттуда json, ты тоже будешь стучаться по ключу в locals. Но это приводит нас к моему предыдущему сообщению - что мешает тогда пользоваться kwargs или вообще передавать словарь как extra_data.
Мне кажется, ты уходишь от темы
источник

Б

Боброний in PiterPy Meetup
Я тут не пытаюсь доказать, что это суперполезный и очень широкоприменимый кейс.
источник

S

Stan in PiterPy Meetup
Чтобы не распространяться дальше - я стою на том, что в locals и в co_varnames должны быть валидные имена, потому что этого требует их семантика. То, что сейчас в каких-то случаях туда можно передать шлак и оно не падает - это не доказательство того, что оно должно работать всегда. И то, что inspect.signature падает - это правильно.
источник

Б

Боброний in PiterPy Meetup
Я просто указываю на то, что в реализация inspect.signature какое-то своё видение на то, как должна выглядеть функция, которое отличается от реализации самой функции в питоне
источник

Б

Боброний in PiterPy Meetup
Stan
Чтобы не распространяться дальше - я стою на том, что в locals и в co_varnames должны быть валидные имена, потому что этого требует их семантика. То, что сейчас в каких-то случаях туда можно передать шлак и оно не падает - это не доказательство того, что оно должно работать всегда. И то, что inspect.signature падает - это правильно.
А я стою на том, что в таком случае это должно быть зашито в реализации функции при её создании, а не только в inspect
источник

Б

Боброний in PiterPy Meetup
Либо не зашито нигде
источник

S

Stan in PiterPy Meetup
Боброний
Я просто указываю на то, что в реализация inspect.signature какое-то своё видение на то, как должна выглядеть функция, которое отличается от реализации самой функции в питоне
Мы опять уходим в детали. но я не вижу в поведении signature ничего отличного от того, как Python видит функции синтаксически. Если на то пошло, то проблема была на этапе .replace, когда ты в co_varnames кладёшь невалидный идентификатор, но там это, скорее всего, обусловлено тем, что это NamedTuple, а не какой-нибудь его подкласс, который делает обширную валидацию.
источник

Б

Боброний in PiterPy Meetup
Stan
Мы опять уходим в детали. но я не вижу в поведении signature ничего отличного от того, как Python видит функции синтаксически. Если на то пошло, то проблема была на этапе .replace, когда ты в co_varnames кладёшь невалидный идентификатор, но там это, скорее всего, обусловлено тем, что это NamedTuple, а не какой-нибудь его подкласс, который делает обширную валидацию.
Нет, там есть проверки
источник

Б

Боброний in PiterPy Meetup
Stan
Мы опять уходим в детали. но я не вижу в поведении 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
источник

Б

Боброний in PiterPy Meetup
Нельзя просто вот так вот создать невалидный кусок кода
источник