2

Pythonインタープリターで次のコマンドを実行します。

  some_list = []
  methodList = [method for method in dir(some_list) if (callable(getattr(some_list, method)) and (not method.find('_')))]

私が欲しいのは、アンダースコアで名前が付けられているメソッドを除いて、特定のオブジェクトのメソッドのすべての名前のリストを取得することです。__sizeof__

これが、上記のコードにifステートメントがネストされている理由です。

 if (callable(getattr(some_list, method)) and (not method.find('_')))

ただし、内容は次のmethodListとおりです。

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__']

Indeed, the precise opposite of what I'm expecting.

Shouldn't not method.find('_') only return true when the method string fails to contain the string '_'?

4

1 に答える 1

6

のドキュメントを参照してくださいstr.find

sub がスライス s[start:end] に含まれるように、部分文字列 sub が見つかった文字列内の最小のインデックスを返します。オプションの引数 start と end は、スライス表記のように解釈されます。sub が見つからない場合は -1 を返します。

アンダースコアが見つからない場合、式method.find('_')は -1 を返し、アンダースコアで始まる場合は 0 を返します。適用notするとは、アンダースコアで始まるメソッドのみが与えることを意味しますTrue( not 0is であるためTrue)。

'_' not in method代わりに使用してください。

于 2012-04-19T23:12:34.263 に答える