我正在使用一些使用该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社区倾向于前学派.
mar*_*cog 24
或者只是使用try..except块:
try:
sock = socket.fromfd(...)
except AttributeError:
sock = socket.socket(...)
Run Code Online (Sandbox Code Playgroud)