sdbbs
sdbbs

Reputation: 5384

Getting all class methods in classes in current file in Python?

I have already seen:

... and based on that, I made this example:

#!/usr/bin/env python3

import sys, os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

import inspect

# https://stackoverflow.com/q/18907712 ; https://stackoverflow.com/q/34439
def get_this_file_functions():
  funclist = []
  for name, obj in inspect.getmembers(sys.modules[__name__]):
    if inspect.isfunction(obj):
      funclist.append(name)
    elif inspect.isclass(obj):
      for attrname, attr in inspect.getmembers(obj):
        if inspect.ismethod(getattr(obj, attrname, None)):
          funclist.append(attrname)
  return funclist


class MyMainWindow(QMainWindow):
  def __init__(self):
    super(MyMainWindow, self).__init__()
    self.init_GUI() # NB: Blocks, because of self.show()!

  def init_GUI(self):
    self.setGeometry(50, 50, 850, 650)
    self.setWindowTitle("Window Title")
    print("get_this_file_functions:\n{}".format(get_this_file_functions()))
    self.show() # blocks


################################ MAIN
if __name__== '__main__':
  app = QApplication(sys.argv)
  myGUI = MyMainWindow()
  sys.exit(app.exec_())

... however, when I run this, all I get printed is:

get_this_file_functions:
['get_this_file_functions']

... that is - I don't get MyMainWindow.__init__ nor MyMainWindow.init_GUI.

So, how can I get all functions defined in a file - including all defined class methods?

Upvotes: 0

Views: 1012

Answers (1)

Iguananaut
Iguananaut

Reputation: 23306

On Python 3, calling inspect.ismethod on an attribute of a class that happens to be a function will always be False, because it will just be a plain function. function.__get__ only returns a method object when accessed as an attribute of an instance.

If you want to get all "methods" of the class just use inspect.isfunction.

>>> class A:
...     def __init__(self): pass
... 
>>> A.__init__
<function A.__init__ at 0x7fd524dd2f80>
>>> inspect.ismethod(A.__init__)
False
>>> inspect.isfunction(A.__init__)
True
>>> inspect.ismethod(A().__init__)
True

Upvotes: 2

Related Questions