简体   繁体   中英

Why does this python logic statement behave opposite to my expected behavior?

I run the following in the Python interpreter:

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

What I would like is to get a list of all the names of methods for a particular object, except methods that are named with underscores, ie __sizeof__

This is why I have the if statement nested in my above code:

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

But the contents of methodList are:

['__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 '_' ?

See the documentation for str.find .

Return the lowest index in the string where substring sub is found, such that sub is contained in the slice s[start:end]. Optional arguments start and end are interpreted as in slice notation. Return -1 if sub is not found.

The expression method.find('_') returns -1 if an underscore is not found, and 0 if it starts with an underscore. Applying not means that only methods that start with an underscore will give True (because not 0 is True ).

Use '_' not in method instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM