Я попытался поиграть со встроенным строковым типом, задаваясь вопросом, могу ли я использовать строки с синтаксисом with
.Очевидно, что следующее не получится:
with "hello" as hello:
print(f"{hello} world!")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __enter__
Затем, просто получая класс из str
с двумя необходимыми атрибутами для with
:
class String(str):
def __enter__(self):
return self
def __exit__(self):
...
with String("hello") as hello:
print(f"{hello} world!")
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: __exit__() takes 1 positional argument but 4 were given
Хорошо, интересно, что этоАргументы: .., я добавил *args, **kwargs
к __exit__
, а затем попробовал еще раз:
class String(str):
def __enter__(self):
return self
def __exit__(self, *args, **kwargs):
print("args: ", args)
print("kwargs: ", kwargs)
with String("hello") as hello:
print(f"{hello} world!")
hello world!
args: (None, None, None)
kwargs: {}
Работает также с разными типами, которые, как я думаю, обычно можно вызывать с str()
, но чтоэти три аргумента?Как мне найти дополнительную информацию о трех дополнительных аргументах?Я думаю, наконец, где я могу увидеть реализацию встроенных типов и т.д ...?