Как узнать, является ли одна функция Python псевдонимом для другой?

В этом вопросе - В чем разница между io. open() и os.open() на Python? — я узнал, что функция Python open() является псевдонимом функции io.open().

Мой вопрос: как узнать, использует ли одна функция Python другую?

Я думал, что функция id() мне поможет, но в случае open() и io.open() она возвращает разные значения:

>>> import io
>>> id(open)
140172515129392
>>> id(io.open)
28340168

Я использую Python 2.7.3


person golem    schedule 18.01.2015    source источник
comment
Какую настоящую проблему вы пытаетесь решить?   -  person NPE    schedule 18.01.2015
comment
Вы тестируете его в неправильной версии Python, попробуйте в Python 3.   -  person Ashwini Chaudhary    schedule 18.01.2015
comment
@NPE не всегда решает проблему. В моем случае это просто обучение. Углубление помогает мне лучше понять это.   -  person golem    schedule 18.01.2015
comment
@golem: Это имеет смысл, и сравнение идентификаторов или использование оператора is - это правильный путь. Имейте в виду, что есть много способов сломать эту проверку (например, простая оболочка, такая как лямбда-функция, будет иметь другой id).   -  person NPE    schedule 18.01.2015


Ответы (2)


В Python 3 функция open() действительно является одним и тем же объектом:

>>> sys.version
'3.4.2 (default, Nov 29 2014, 18:28:46) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)]'
>>> id(open)
4467734600
>>> id(io.open)
4467734600
>>> io.open is open
True

Однако это не в Python 2. Модуль io доступен для прямой совместимости, но старая подсистема ввода-вывода по-прежнему используется по умолчанию:

>>> import sys, io
>>> sys.version
'2.7.8 (default, Nov 29 2014, 18:24:03) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)]'
>>> io.open is open
False

Библиотека io была добавлена ​​в Python 2.6:

В Python 2.6 базовые реализации не были реструктурированы для построения поверх классов модуля io. Модуль предоставляется, чтобы упростить написание кода, совместимого с версией 3.0, и избавить разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.

person Martijn Pieters    schedule 18.01.2015

В Python 3.4,

>>> import io
>>> open is io.open
True

В Python 2.x это разные объекты, и вместо них вы получите False.

person Hugh Bothwell    schedule 18.01.2015
comment
Не работает в CPython 2.7.3 (и явно не в случае OP, где два id различаются). - person NPE; 18.01.2015
comment
@NPE работает, просто в 2.7 open не использует io.open - person Jon Clements♦; 18.01.2015
comment
@JonClements: я думаю, это нужно указать в ответе. - person NPE; 18.01.2015
comment
@NPE похоже, что Мартейн уже рассказал об этом в своем ответе :) - person Jon Clements♦; 18.01.2015
comment
@JonClements: Да, и поэтому его ответ получил мой голос. :-) Помимо этого, я до сих пор не могу отделаться от ощущения, что есть что-то вроде XY Проблема в этом вопросе. - person NPE; 18.01.2015
comment
@NPE, спасибо, что указали на существование такого понятия. После некоторых размышлений я думаю, что я действительно задал свой вопрос так, что он выглядит как проблема XY. Вероятно, мне следовало разделить вопрос на два: 1) Как правильно узнать, является ли одна функция псевдонимом другой; и 2) Являются ли функции open() и io.open() действительно одним и тем же. В любом случае, у меня есть ответы. - person golem; 18.01.2015
comment
@golem: Пока у тебя есть ответы, это все, что имеет значение. Просто мы часто видим XY-вопросы, и все это превращается в довольно разочаровывающий опыт как для человека, который задает вопрос, так и для тех, кто пытается помочь. :-) - person NPE; 18.01.2015