Соревнование: Как создать переменную без оператора `=`, Python
Соревнование:
Требуется написать код на Python, после выполнения которого такая строка кода выведет 50:
print(test)
Вывод:
50
При этом запрещается использовать оператор = в своём коде. Любые сторонние методы приветствуются.
Ещё одно условие: один способ - один ответ. Допускается публикация нескольких способов от одного участника, но в разных ответах.
Формат ответа
"Описание (если есть)"
# "Действия"
print(test) # В основной части кода
"Пояснения (если есть)"
Критерий победы
Самое большое количество голосов по состоянию на 15.12.2022.
Приз победителя:
Его ответ будет принят (т.е. +15 репутации).
Ответы (15 шт):
Например, так:
Создать новый файл, в нем создать переменную, а потом импортировать его и вытащить его так:
print(your_file.your_variable)
- Класс и метакласс:
class Meta(type):
def __repr__(cls):
return '50'
class test(object, metaclass=Meta):
pass
print(test)
- Класс и подмена функции
print
from sys import stdout
class test:
pass
print = lambda x: stdout.write('50')
print(test)
try-except, правда в этом случае переменная вообще не создаётся, но вывод ожидаемый:
try:
print(test)
except:
print(50)
Можно так:
exec("test = 50")
print(test)
Формально сам оператор = не используется.
что-то никто самого элементарного не предложил:
for test in [50]:pass
print(test)
И вот так тоже можно:
globals().__setitem__('test', 50)
print(test)
Я бы победила!
"""50"""
print(__doc__) # если так считается...
"""50"""
if test := __doc__:
pass
print(test) # если не менять тестовую строку...
И вот так:
match test := '50':
case _:
pass
print(test)
теперь точно, победила! ;)
for отлично играет роль присваивания:
for test in [50]:
pass
print(test)
@splash58 предложил самую лучшую идею: print(test := 50)!
Максимально лаконичная версия без оператора =:
(test := 50)
print(test)
Идея подмены print из 2 варианта от @CrazyElf, только доделанная без =:
import builtins
def print(*args, **kwargs):
builtins.print('50')
class test:
pass
print(test)
С помощью contextlib.suppress можно подавить исключение NameError внутри менеджера контекста. А символ \ позволяет перенести print(test) на новую строку, но технически оставив её для Python внутри with:
from contextlib import suppress
with suppress(NameError): print('50'); \
print(test)
Почему бы не воспользоваться ASCII? :)
globals().__setitem__('test', ord('2')) or test
print(test)
Приложение может импортировать само себя и через __setattr__ создать себе переменную:
import __main__
__main__.__setattr__('test', 50)
print(test)
Можно сократить создание переменной до 1 строки:
__import__(__name__).__setattr__('test', 50)
print(test)