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, i.e. __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.The expression
method.find('_')returns -1 if an underscore is not found, and 0 if it starts with an underscore. Applyingnotmeans that only methods that start with an underscore will giveTrue(becausenot 0isTrue).Use
'_' not in methodinstead.