Programming
python introspection
Updated Sat, 02 Jul 2022 01:16:35 GMT

Finding what methods a Python object has


Given a Python object of any kind, is there an easy way to get the list of all methods that this object has?

Or,

if this is not possible, is there at least an easy way to check if it has a particular method other than simply checking if an error occurs when the method is called?




Solution

For many objects, you can use this code, replacing 'object' with the object you're interested in:

object_methods = [method_name for method_name in dir(object)
                  if callable(getattr(object, method_name))]

I discovered it at diveintopython.net (now archived), that should provide some further details!

If you get an AttributeError, you can use this instead:

getattr() is intolerant of pandas style Python 3.6 abstract virtual sub-classes. This code does the same as above and ignores exceptions.

import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
                  columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
  methodList = []
  for method_name in dir(object):
    try:
        if callable(getattr(object, method_name)):
            methodList.append(str(method_name))
    except Exception:
        methodList.append(str(method_name))
  processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
  for method in methodList:
    try:
        print(str(method.ljust(spacing)) + ' ' +
              processFunc(str(getattr(object, method).__doc__)[0:90]))
    except Exception:
        print(method.ljust(spacing) + ' ' + ' getattr() failed')
get_methods(df['foo'])




Comments (5)

  • +5 – It's a list comprehension, returning a list of methods where method is an item in the list returned by dir(object), and where each method is added to the list only if getattr(object,method) returns a callable. — Sep 13, 2014 at 01:02  
  • +0 – @marsh To print the methods: print [method for method in dir(object) if callable(getattr(object, method))]. — Oct 29, 2015 at 10:51  
  • +1 – I'm getting an AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError' when I try to run this. See details at stackoverflow.com/q/54713287/9677043. — Feb 15, 2019 at 16:26  
  • +0 – To exclude dunder methods: [ m for m in dir(object) if not m.startswith('__')] — Nov 15, 2019 at 05:31  
  • +0 – Other way using filter: print(list(filter(lambda x: x[0] != '_' and callable(getattr(obj, x)), dir(obj)))) — Feb 06, 2020 at 20:13