I hope to get all classes names and fields within each class given a python file say myFile.py. Is there a way to achieve that? I want to pass in myFile.py and get the result.
            Asked
            
        
        
            Active
            
        
            Viewed 50 times
        
    0
            
            
        - 
                    What exactly do you mean by "field"? Class attributes or instance attributes? And what about properties and other descriptors? – Aran-Fey Apr 04 '18 at 01:26
 - 
                    If you're doing this for exploratory purposes, see the [`inspect`](https://docs.python.org/3/library/inspect.html) module, which is basically every helper function you could ever want for doing this and most things like it. – abarnert Apr 04 '18 at 01:28
 - 
                    @Aran-Fey What I mean is variable declaration within the class like `abc=1` – william007 Apr 04 '18 at 01:29
 - 
                    3Possible duplicate of [Viewing all defined variables](https://stackoverflow.com/questions/633127/viewing-all-defined-variables) – user3483203 Apr 04 '18 at 01:29
 - 
                    If you're doing this for some programmatic reason—e.g., to build some kind of plugin interface that auto-loads all of the user's classes—you probably don't want to do this. Instead, you want to come up with some naming standard (like the `unittest` module) or some registration mechanism (like `codecs`) for the classes, and handle just a specific defined subset of all the possible kinds of things that a class could do. – abarnert Apr 04 '18 at 01:30
 - 
                    @chrisz but how should I pass in `myFile.py` and get the result? – william007 Apr 04 '18 at 01:31
 - 
                    @chrisz I don't think so. That question is asking about the variables defined in the current REPL shell or script, not in some file that he's loading up. – abarnert Apr 04 '18 at 01:31
 - 
                    @abarnert maybe, top answer mentions `dir()`, `globals()`, `locals()`. Pretty good start if you want to enumerate methods and attributes. – user3483203 Apr 04 '18 at 01:33
 - 
                    1This is a (somewhat) commonly-asked question, so it must be a dup of something with an answer that would help the OP here (the answer is basically just `inspect.getmembers(module)`), but every answer that seems relevant, the questioner already knows about `inspect`… – abarnert Apr 04 '18 at 01:33
 - 
                    1@chrisz What good is either `globals` or `locals` going to do for you in enumerating a module or a class in that module? – abarnert Apr 04 '18 at 01:34
 - 
                    1Yea may have flagged it as the wrong one – user3483203 Apr 04 '18 at 01:34
 
1 Answers
0
            
            
        Have you considered parsing your Python file with the built-in Abstract Syntax Trees (ast) module, and then examining the results to retrieve the data of interest? Something as simple as:
import ast
def print_info(path):
    with open(path, "r") as src:
        compiled = ast.parse(src.read(), "<string>", "exec")
        for element in compiled.body:
            if isinstance(element, ast.ClassDef):  # we're interested only in classes
                fields = []
                methods = []
                for field in element.body:  # iterate over the class fields/methods
                    if isinstance(field, ast.Assign):  # field assignment
                        for target in field.targets:  # value can be assigned to many fields
                            fields.append(target.id)
                    elif isinstance(field, ast.FunctionDef):  # method definition
                        methods.append(field.name)
                    # etc.
                print("Class: " + element.name)
                print("\tFields:  " + ", ".join(fields))
                print("\tMethods: " + ", ".join(methods))
fulfills your main requirement. For example, if we had a python source file as myFile.py containing:
class A(object):
    name = "A"
    def __init__(self, x):
        self.x = x
class B(object):
    name = "B"
    kind = "Child"
    def instance_method(self):
        pass
    @classmethod
    def class_method(cls):
        pass
    @staticmethod
    def static_method():
        pass
we could easily parse it using the above:
print_info("myFile.py")
And the output would look like:
Class: A
    Fields:  name
    Methods: __init__
Class: B
    Fields:  name, kind
    Methods: instance_method, class_method, static_method
Check the rest of the ast package to see what sort of a data you can extract from it (hint: most of it).
        zwer
        
- 24,943
 - 3
 - 48
 - 66