Откуда берутся три аргумента в этой функции __exit__, расширяющей базовый тип python? - PullRequest
0 голосов
/ 27 сентября 2019

Я попытался поиграть со встроенным строковым типом, задаваясь вопросом, могу ли я использовать строки с синтаксисом 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(), но чтоэти три аргумента?Как мне найти дополнительную информацию о трех дополнительных аргументах?Я думаю, наконец, где я могу увидеть реализацию встроенных типов и т.д ...?

...