确定Python模块中是否有可用的函数

Dav*_*ron 27 python

我正在使用一些使用该socket.fromfd()函数的Python套接字代码.

但是,此方法并非在所有平台上都可用,因此在未定义方法的情况下,我正在编写一些回退代码.

确定方法是否在运行时定义的最佳方法是什么?以下是否足够或有更好的成语?

if 'fromfd' in dir(socket):
    sock = socket.fromfd(...)
else:
    sock = socket.socket(...)
Run Code Online (Sandbox Code Playgroud)

我有点担心文档dir()似乎不鼓励使用它.将getattr()是一个更好的选择,如:

if getattr(socket, 'fromfd', None) is not None:
    sock = socket.fromfd(...)
else:
    sock = socket.socket(...)
Run Code Online (Sandbox Code Playgroud)

思考?

编辑正如Paolo所指出的,这个问题几乎与确定属性存在的问题重复.但是,由于使用的术语是不相交的(lk的"对象有一个属性" vs我的"模块有一个函数"),保留这个问题以获得可搜索性可能会有所帮助,除非两者可以组合.

Pao*_*ino 42

hasattr()是最好的选择.去吧.:)

if hasattr(socket, 'fromfd'):
    pass
else:
    pass
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,根据文档,所有hasattr正在做的是调用getattr并捕获异常.因此,如果你想削减中间人,你应该选择marcog的答案.

编辑:我也刚刚意识到这个问题实际上是重复的.其中一个答案讨论了你所拥有的两个选项的优点:捕捉异常("更容易要求宽恕而不是许可")或者只是事先检查("在你跳跃之前看").老实说,我更像是后者,但似乎Python社区倾向于前学派.

  • “不应该使用 hasattr,因为它会吞掉包括键盘中断在内的异常。” (c) http://doc.bazaar.canonical.com/developers/code-style.html#hasattr-and-getattr,所以 `getattr` 是一个好东西。 (2认同)

mar*_*cog 24

或者只是使用try..except块:

try:
  sock = socket.fromfd(...)
except AttributeError:
  sock = socket.socket(...)
Run Code Online (Sandbox Code Playgroud)