【问题标题】:Get dot separated path of a standard library function from the function itself从函数本身获取标准库函数的点分隔路径
【发布时间】:2019-09-12 23:32:08
【问题描述】:

有没有办法获取标准库函数的全名(函数的点分隔路径,包括其名称)?例如:

import sys
import os
from random import choice

my_function = choice([sys.exit, os.path.join, os.getcwd])

print(my_function) # Somehow generate full name of the built-in function
# Would expect to get one of 'sys.exit', 'os.path.join' or 'os.getcwd'

【问题讨论】:

  • 你会用这样的功能做什么?
  • 将存储人类可读的日志,调用了哪个函数。
  • 没有任何解释就投反对票?请让我知道这个问题有什么问题。我已经修复了错误的标记(将builtin 更改为standard-library)。

标签: python python-3.x standard-library


【解决方案1】:

您可以使用函数的__module____qualname__ 属性(在Python 3 下)获取您要查找的信息。例如:

>>> import sys
>>> func = sys.exit
>>> print('{}.{}'.format(func.__module__, func.__qualname__))
sys.exit

这也适用于班级成员:

>>> import email.message

>>> func = email.message.Message.get_payload
>>> print('{}.{}'.format(func.__module__, func.__qualname__))
email.message.Message.get_payload

在 Python 2.x 下需要做更多的工作,因为 __qualname__ 属性不可用:

>>> print('{}.{}.{}'.format(func.__module__, func.im_class.__name__, func.__name__))

【讨论】:

  • 对于os.path.join,我得到"posixpath.join",但我希望"os.path.join"
  • os.path 是一个糟糕的测试用例,因为它实际上最终会成为posixpathmacpathntpath 等,具体取决于平台。所以你实际上得到了正确的答案。
  • 奇怪的是您选择使用func.__qualname__ 而不是func.__name__。有什么区别?
  • 比较email.message.Message.get_payload.__name__email.message.Message.get_payload.__qualname__的输出。
  • 所以__name__ 只返回函数名,例如'get_payload'__qualname__ 也包含类名,例如'Message.get_payload'。伟大的!谢谢@larsks!
猜你喜欢
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多