Мы уже знаем, что аргументы функции используются для ограничения 255 явно переданных аргументов. Тем не менее, это поведение теперь меняется, и с Python-3.7 нет ограничений, кроме sys.maxsize
который на самом деле является пределом контейнеров python. Но как насчет локальных переменных?
В принципе мы не можем добавлять локальные переменные в функцию динамически и/или изменять словарь locals()
не допускается напрямую, так что можно даже проверить это с помощью грубой силы. Но проблема в том, что даже если вы меняете locals()
с помощью модуля compile
или функции exec
это не влияет на function.__code__.co_varnames
, следовательно, вы не можете напрямую обращаться к переменным внутри функции.
In [142]: def bar():
...: exec('k=10')
...: print(f"locals: {locals()}")
...: print(k)
...: g = 100
...:
...:
In [143]: bar()
locals: {'k': 10}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-143-226d01f48125> in <module>()
----> 1 bar()
<ipython-input-142-69d0ec0a7b24> in bar()
2 exec('k=10')
3 print(f"locals: {locals()}")
----> 4 print(k)
5 g = 100
6
NameError: name 'k' is not defined
In [144]: bar.__code__.co_varnames
Out[144]: ('g',)
Это означает, что даже если вы используете цикл for
например:
for i in range(2**17):
exec(f'var_{i} = {i}')
locals()
будут содержать 2 ** 17 переменных, но вы не можете сделать что-то вроде print(var_100)
внутри функции.
Мы знаем, что в принципе нет необходимости динамически добавлять переменную в функцию, в то время как вы можете использовать словарь или, другими словами, собственное пространство имен. Но какой правильный способ проверить предел максимального числа локальных переменных в функции?