2009-04-18 5 views
18

私はsocket.fromfd()関数を使っているPythonソケットコードを使っています。関数がPythonモジュールで利用可能かどうかを調べる

ただし、この方法はすべてのプラットフォームで使用できるわけではないため、メソッドが定義されていない場合の代替コードを作成しています。

実行時にメソッドが定義されているかどうかを判断する最良の方法は何ですか?以下は十分ですか、より良いイディオムがありますか?

if 'fromfd' in dir(socket): 
    sock = socket.fromfd(...) 
else: 
    sock = socket.socket(...) 

私はdir()のドキュメントは、その使用を阻止するらしいことを少し心配です。 getattr()は、より良い選択になるでしょうか:

if getattr(socket, 'fromfd', None) is not None: 
    sock = socket.fromfd(...) 
else: 
    sock = socket.socket(...) 

思考?

EDITPaoloが指摘したように、この質問は、属性の存在を決定するについての質問のnearly a duplicateです。しかし、使用されている用語が互いに素であるため(lkの"オブジェクトの属性が"と私の"のモジュールには" "の機能があります)、この2つを組み合わせることができない限り、

答えて

24

hasattr()が最適です。それで行こう。 :)

if hasattr(socket, 'fromfd'): 
    pass 
else: 
    pass 

EDIT:実際には、ドキュメントによると、すべてはhasattrはGETATTRを呼び出し、例外をキャッチされてやっています。だから、あなたが中央の男を切りたいなら、あなたはmarcogの答えと一緒に行くべきです。

EDIT:私もちょうどこの質問は実際にduplicateで実現。ここでの答えの1つは、例外をキャッチすること(「許可よりも許してほしいと思う方が簡単」)、または手前で単にチェックすること(「飛び越す前に見る」)の2つのオプションのメリットについてです。正直言って、私は後者の方がはるかですが、Pythonコミュニティが前の思考学校に傾いているようです。

+0

この回答はdownvoteに値するどのように私は見ていない...:/ –

+1

私は読みやすさのためにGETATTR上ではhasattrを好みます! – bobince

+1

"hasattrはKeyboardInterruptを含む例外を呑み込むので使用しないでください。" (c)http://doc.bazaar.canonical.com/developers/code-style.html#hasattr-and-getattr、 'getattr'は良いことです。 –

19

それとも単にtry..exceptブロックを使用します。

try: 
    sock = socket.fromfd(...) 
except AttributeError: 
    sock = socket.socket(...) 
+0

NameErrorではなく、存在しない場合はAttributeErrorをスローします。 –

+1

これは最もpythonicなソリューションです。 –

3

はhasattr(OBJ、 'attributenameの')は、おそらくより良いものです。 hasattrは属性にアクセスしようとしますが、それがなければfalseを返します。

Pythonで動的メソッドを使用できます。つまり、アクセスしようとすると作成されるメソッドです。彼らはdir(...)にいないだろう。しかしhasattrはそれをチェックするでしょう。

>>> class C(object): 
... def __init__(self): 
...  pass 
... def mymethod1(self): 
...  print "In #1" 
... def __getattr__(self, name): 
...  if name == 'mymethod2': 
...  def func(): 
...   print "In my super meta #2" 
...  return func 
...  else: 
...  raise AttributeError 
... 
>>> c = C() 
>>> 'mymethod1' in dir(c) 
True 
>>> hasattr(c, 'mymethod1') 
True 
>>> c.mymethod1() 
In #1 
>>> 'mymethod2' in dir(c) 
False 
>>> hasattr(c, 'mymethod2') 
True 
>>> c.mymethod2() 
In my super meta #2 
関連する問題