Size: a a a

2020 March 09

p

pragus in PiterPy Meetup
источник
2020 March 10

Б

Боброний in PiterPy Meetup
Ох уж этот inspect:

import inspect

def f():
   print(locals())

f.__code__ = f.__code__.replace(
   co_nlocals=1,
   co_argcount=1,
   co_varnames=('invalid-identifier',)
)

help(f)  # Help on function f in module __main__: f(...)
f(**{'invalid-identifier': 1})  # {'invalid-identifier': 1}
inspect.signature(f)  # ValueError: 'invalid-identifier' is not a valid parameter name
источник

S

Stan in PiterPy Meetup
Боброний
Ох уж этот inspect:

import inspect

def f():
   print(locals())

f.__code__ = f.__code__.replace(
   co_nlocals=1,
   co_argcount=1,
   co_varnames=('invalid-identifier',)
)

help(f)  # Help on function f in module __main__: f(...)
f(**{'invalid-identifier': 1})  # {'invalid-identifier': 1}
inspect.signature(f)  # ValueError: 'invalid-identifier' is not a valid parameter name
А что не так?
источник

Б

Боброний in PiterPy Meetup
Боброний
Ох уж этот inspect:

import inspect

def f():
   print(locals())

f.__code__ = f.__code__.replace(
   co_nlocals=1,
   co_argcount=1,
   co_varnames=('invalid-identifier',)
)

help(f)  # Help on function f in module __main__: f(...)
f(**{'invalid-identifier': 1})  # {'invalid-identifier': 1}
inspect.signature(f)  # ValueError: 'invalid-identifier' is not a valid parameter name
Зачем вообще эту проверку впихнули, если питон позволяет использовать такие имена в качестве параметров?
источник

Б

Боброний in PiterPy Meetup
Stan
А что не так?
Функция работает, в неё можно передавать параметры, у неё есть help (пускай и не очень информативный), а inspect на ней валится
источник

S

Stan in PiterPy Meetup
Боброний
Зачем вообще эту проверку впихнули, если питон позволяет использовать такие имена в качестве параметров?
 python3.7
Python 3.7.5 (default, Nov  7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo(a-b): pass
 File "<stdin>", line 1
   def foo(a-b): pass
            ^
SyntaxError: invalid syntax


Позволяет ли?
источник

Б

Боброний in PiterPy Meetup
Stan
 python3.7
Python 3.7.5 (default, Nov  7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo(a-b): pass
 File "<stdin>", line 1
   def foo(a-b): pass
            ^
SyntaxError: invalid syntax


Позволяет ли?
Это синтакис
источник

Б

Боброний in PiterPy Meetup
Language:
py3


Source:
dict(a-b=1)


Errors:
File "source_file.py", line 1
   dict(a-b=1)
       ^
SyntaxError: keyword can't be an expression
источник

Б

Боброний in PiterPy Meetup
При этом очевидно, что можно использовать такой ключ в словаре
источник

Б

Боброний in PiterPy Meetup
Боброний
Ох уж этот inspect:

import inspect

def f():
   print(locals())

f.__code__ = f.__code__.replace(
   co_nlocals=1,
   co_argcount=1,
   co_varnames=('invalid-identifier',)
)

help(f)  # Help on function f in module __main__: f(...)
f(**{'invalid-identifier': 1})  # {'invalid-identifier': 1}
inspect.signature(f)  # ValueError: 'invalid-identifier' is not a valid parameter name
И с параметрами функции то же самое
источник

DB

Dima Boger in PiterPy Meetup
Боброний
При этом очевидно, что можно использовать такой ключ в словаре
Так, я все равно не понял
источник

S

Stan in PiterPy Meetup
Боброний
Это синтакис
И? Если ты про то, что в kwargs можно передать любой шлак - ну так передавай, а не делай имена аргументов невалидными. co_varnames - это имена аргументов и переменных в функции и они должны соответствовать определённым правилам.
источник

Б

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

Б

Боброний in PiterPy Meetup
Выше это видно на примере: функция работает, параметры передаются
источник

DB

Dima Boger in PiterPy Meetup
Боброний
При этом очевидно, что можно использовать такой ключ в словаре
Кейворды аргументов это подмножество словаря же, оно не обязательно работает в другую сторону
источник

DB

Dima Boger in PiterPy Meetup
То что ты захачил через внутряки намекает, что оно и не должно работать
источник

DB

Dima Boger in PiterPy Meetup
Можно и __dict__ подменить же
источник

S

Stan in PiterPy Meetup
Боброний
Так нет, не должны
co_varnames - это наверняка берётся из синтаксиса, и должно выглядеть валидно. Хочется передавать что-то странненькое - ну так используй ** как при передаче, так и при чтении.

Правда, ты намеренно ограничиваешь этим себе возможности синтаксиса, так что не уверен в профите.
источник

S

Stan in PiterPy Meetup
То, что ты используешь в качестве доказательства того, что функция работает - это всего лишь то, что это имя попадает в locals. Это может быть лишь особенности реализации - образно, что при передаче аргументов в функцию python во внутрянке делает что-то вроде locals.update(kwargs). Ты же не сможешь написать нормальный код (не подсовывая его через inspect), в котором бы в locals нормально попал бы foo-bar?
источник

Б

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

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