Какие вызовы в Python не могут вызывать `__call__`? ⇐ Python
-
Anonymous
Какие вызовы в Python не могут вызывать `__call__`?
Ответ на мой вопрос может зависеть от интерпретатора кода, хотя я не уверен. Если да, то я был бы рад услышать о любом широко используемом интерпретаторе Python, особенно, возможно, о CPython.
Если я реализую метод __call__ для класса C, то вызов экземпляра c из C вызовет c.__call__, который затем может, в свою очередь, использовать свой собственный метод __call__. Однако ясно, что не каждый вызываемый объект c всегда использует c.__call__, когда он вызывается в цепочке вызовов, такой как рассмотренный.
В качестве примера: вызов вызываемого(!) объекта get := vars(cls)["__get__"], где cls — это класс types.WrapperDescriptorType не всегда может полагаться на get.__call__, поскольку get имеет тип cls, и то же самое call := vars(cls)["__call__"]! (Если бы для получения get.__call__ требовался get.__get__, то для его получения потребовался бы вызов get, например get( получить, получить, cls) в какой-то момент.
На самом деле get.__call__ будет получен не как call.__get__(get, cls), а, видимо, как get(call, get, cls)< /код>.)
Вопрос. Учитывая вызываемый объект c, как узнать, всегда ли его вызов опирается на c.__call__? Мне нужен способ, который будет работать для всех ближайших версий Python, при этом более надежный способ нужен сильнее.
Ответ на мой вопрос может зависеть от интерпретатора кода, хотя я не уверен. Если да, то я был бы рад услышать о любом широко используемом интерпретаторе Python, особенно, возможно, о CPython.
Если я реализую метод __call__ для класса C, то вызов экземпляра c из C вызовет c.__call__, который затем может, в свою очередь, использовать свой собственный метод __call__. Однако ясно, что не каждый вызываемый объект c всегда использует c.__call__, когда он вызывается в цепочке вызовов, такой как рассмотренный.
В качестве примера: вызов вызываемого(!) объекта get := vars(cls)["__get__"], где cls — это класс types.WrapperDescriptorType не всегда может полагаться на get.__call__, поскольку get имеет тип cls, и то же самое call := vars(cls)["__call__"]! (Если бы для получения get.__call__ требовался get.__get__, то для его получения потребовался бы вызов get, например get( получить, получить, cls) в какой-то момент.
На самом деле get.__call__ будет получен не как call.__get__(get, cls), а, видимо, как get(call, get, cls)< /код>.)
Вопрос. Учитывая вызываемый объект c, как узнать, всегда ли его вызов опирается на c.__call__? Мне нужен способ, который будет работать для всех ближайших версий Python, при этом более надежный способ нужен сильнее.
Мобильная версия