【问题标题】:How do I find out if one Python function is an alias for another one?如何确定一个 Python 函数是否是另一个 Python 函数的别名?
【发布时间】:2015-03-16 15:15:06
【问题描述】:

在这个问题 - What's the difference between io.open() and os.open() on Python? - 我了解到 Python open() 函数是 io.open() 函数的别名。

我的问题是如何确定一个 Python 函数是否为另一个函数取别名?

我认为 id() 函数会帮助我,但在 open()io.open() 的情况下它返回不同的值:

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

我正在使用 Python 2.7.3

【问题讨论】:

  • 您要解决的实际问题是什么?
  • 您在错误的 Python 版本中测试它,请在 Python 3 中尝试。
  • @NPE 并不总是解决问题。就我而言,这只是学习。更深入地帮助我更好地理解它。
  • @golem:这是有道理的,比较 id 或使用 is 运算符是可行的方法。请记住,有很多方法可以分解此检查(例如,简单的包装器 - 例如 lambda 函数 - 将具有不同的 id)。

标签: python file alias file-handling


【解决方案1】:

在 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 模块可用于向前兼容,但旧的 I/O 子系统仍然是默认的:

>>> 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 库是 added to Python 2.6

在 Python 2.6 中,底层实现尚未重新构建以构建在 io 模块的类之上。提供该模块是为了更轻松地编写与 3.0 前向兼容的代码,并节省开发人员编写自己的缓冲和文本 I/O 实现的工作量。

【讨论】:

    【解决方案2】:

    在 Python 3.4 中,

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

    在 Python 2.x 中,它们是不同的对象,而您将得到 False

    【讨论】:

    • 在 CPython 2.7.3 中不起作用(显然不是在 OP 的情况下,两个 ids 不同)。
    • @NPE 它确实有效 - 只是在 2.7 中 open 不使用 io.open
    • @JonClements:我认为需要在答案中说明这一点。
    • @NPE 看起来 Martijn 已经在他的回答中介绍了它:)
    • @JonClements:他做到了,这就是为什么他的回答得到了我的支持。 :-) 除此之外,我仍然无法摆脱在这个问题中存在XY Problem 的感觉。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2013-11-03
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多