Соревнование: Как создать переменную без оператора `=`, Python

Соревнование:

Требуется написать код на Python, после выполнения которого такая строка кода выведет 50:

print(test)

Вывод:

50

При этом запрещается использовать оператор = в своём коде. Любые сторонние методы приветствуются.

Ещё одно условие: один способ - один ответ. Допускается публикация нескольких способов от одного участника, но в разных ответах.

Формат ответа


"Описание (если есть)"

# "Действия"

print(test)  # В основной части кода

"Пояснения (если есть)"


Критерий победы

Самое большое количество голосов по состоянию на 15.12.2022.

Приз победителя:

Его ответ будет принят (т.е. +15 репутации).


Ответы (15 шт):

Автор решения: AnGeL0ChEk

Например, так:

Создать новый файл, в нем создать переменную, а потом импортировать его и вытащить его так:

print(your_file.your_variable)
→ Ссылка
Автор решения: CrazyElf
  1. Класс и метакласс:
class Meta(type):
    def __repr__(cls):
        return '50'

class test(object, metaclass=Meta):
    pass

print(test)
  1. Класс и подмена функции print
from sys import stdout

class test:
    pass

print = lambda x: stdout.write('50')
print(test)
  1. try-except, правда в этом случае переменная вообще не создаётся, но вывод ожидаемый:
try:
    print(test)
except:
    print(50)
→ Ссылка
Автор решения: Эникейщик
for test in range(50,51):
  print(test)
→ Ссылка
Автор решения: Vestalt

Можно так:

exec("test = 50")
print(test)

Формально сам оператор = не используется.

→ Ссылка
Автор решения: aleksandr barakin

что-то никто самого элементарного не предложил:

for test in [50]:pass
print(test)
→ Ссылка
Автор решения: чистов_n

И вот так тоже можно:

globals().__setitem__('test', 50)

print(test)
→ Ссылка
Автор решения: AnnaBazueva

Я бы победила!

"""50"""
print(__doc__)  # если так считается...
"""50"""
if test := __doc__:
    pass
print(test)  # если не менять тестовую строку...
→ Ссылка
Автор решения: AnnaBazueva

Ещё так...

if test := '50':
    pass
print(test)
→ Ссылка
Автор решения: AnnaBazueva

И вот так:

match test := '50':
    case _:
        pass
print(test)

теперь точно, победила! ;)

→ Ссылка
Автор решения: Stanislav Volodarskiy

for отлично играет роль присваивания:

for test in [50]:
    pass

print(test)
→ Ссылка
Автор решения: Be3y4uu_K0T

@splash58 предложил самую лучшую идею: print(test := 50)!

Максимально лаконичная версия без оператора =:

(test := 50)
print(test)
→ Ссылка
Автор решения: mrgervant

Идея подмены print из 2 варианта от @CrazyElf, только доделанная без =:

import builtins

def print(*args, **kwargs):
    builtins.print('50')

class test:
    pass

print(test)
→ Ссылка
Автор решения: mrgervant

С помощью contextlib.suppress можно подавить исключение NameError внутри менеджера контекста. А символ \ позволяет перенести print(test) на новую строку, но технически оставив её для Python внутри with:

from contextlib import suppress

with suppress(NameError): print('50'); \
print(test)
→ Ссылка
Автор решения: tiovi

Почему бы не воспользоваться ASCII? :)

globals().__setitem__('test', ord('2')) or test
print(test)
→ Ссылка
Автор решения: mrgervant

Приложение может импортировать само себя и через __setattr__ создать себе переменную:

import __main__
__main__.__setattr__('test', 50)

print(test)

Можно сократить создание переменной до 1 строки:

__import__(__name__).__setattr__('test', 50)

print(test)
→ Ссылка