Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5274

Re: [Python-de] Klassen rekursiv in einem Modul instantiieren

Newsgroups de.comp.lang.python
Date 2018-10-10 09:51 -0700
References <c3736ae4-6baa-4147-9e97-4ef6a6b243ba@googlegroups.com> <70bd0008-303f-01b8-9285-6a6a44e97e78@goebel-consult.de> <mailman.74.1539157083.2799.python-de@python.org>
Message-ID <6b61e1ae-2c48-4bd4-a388-661155086365@googlegroups.com> (permalink)
Subject Re: [Python-de] Klassen rekursiv in einem Modul instantiieren
From Philipp Kraus <philipp.kraus.flashpixx@gmail.com>

Show all headers | View raw


Vielen Dank für die Antworten. Ich habe nun folgendes geabut

---
def classlist(package, baseclass=object, recursive=True):
    if isinstance(package, str):
        package = importlib.import_module(package)

    results = []
    for _, name, is_pkg in pkgutil.walk_packages(package.__path__):
        full_name = package.__name__ + '.' + name

        if not is_pkg:
            for c in importlib.import_module((full_name)).__dict__.values():
                if isinstance(c, type) and issubclass(c, baseclass) and not c == baseclass:
                    results.append(c)
        
        if recursive and is_pkg:
            results.extend(classlist(full_name, baseclass, recursive))

    return results 
---

mein Aufruf sieht dann so aus

---
classlist(mymodule.algorithm, mymodule.algorithm.Algorithm)
---

er geht die Module rekursiv durch, holt sich dann alle Klassen, prüft die Klassen, ob sie von der Basisklasse abgeleitet wurden (überspringt ggf die Basisklasse) und liefert eine Liste mit Klassen zurück, die dann einfach instantiiert werden können. Ich habe noch die Basisklasse in die __init__.py verlagert, es macht eine klarere Struktur

Danke für die Hilfe

Phil


Am Mittwoch, 10. Oktober 2018 09:38:05 UTC+2 schrieb Hartmut Goebel:
> Am 09.10.2018 um 22:29 schrieb Philipp Kraus:
> > Ich möchte jetzt in der __main__.py einmal rekursiv über alle *.py Dateien in algorithm durch gehen und aus jeder *.py Datei die Klasse instantiieren
> 
> Am besten wohl mit pkgutil.walk_modules. Falls es nicht rekursiv sein
> soll, mit pkgutil.iter_modules.
> 
> Ungefähr so (siehe auch doc-string der Funktionen)
> 
> print([b
>       for a,b,c in 
>       pkgutil.iter_modules(
>           mymodule.algorithm.__path__,
>           mymoduel.algorithm.__name__+".")])
> 
> Dabei bekommst Du natürlich auch mymodule.algorithm.algorithm. Überlege
> Dir mal, ob Du den Code dieses module nicht in das Paket (alsi die
> __init__.py-Datei) von mymodule.algorithm versheiben kannst. Dann sparst
> Du das filtern.
> 
> Wenn Dir dieser Tipp geholfen hat, habe ich eine Bitte: Probiere aus, ob
> das auch noch funktioniert, wenn Du Dein Programm mit PyInstlaller
> packetiert hast. (Hierzu musst Du wohl erstmal alle Sub-Module als
> --hidden-import angeben, oder einen zwei-Zeiler "hook" schreiben.)
> Schick mir dann bitte eine Nachricht oder mache auf Github einen
> Bug-Report auf. Herzlichen Dank!
> 
> -- 
> Schönen Gruß
> Hartmut Goebel
> Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
> Information Security Management, Security Governance, Secure Software
> Development
> 
> Goebel Consult, Landshut
> http://www.goebel-consult.de
> 
> Blog:
> https://www.goe-con.de/blog/nicht-pgp-ist-gescheitert-die-entwickler-haben-versagt
> 
> Kolumne:
> https://www.goe-con.de/hartmut-goebel/cissp-gefluester/2011-08-horrorszenario-bring-your-own-device

Back to de.comp.lang.python | Previous | NextPrevious in thread | Find similar


Thread

Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-09 13:29 -0700
  Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Florian Diesch <diesch@spamfence.net> - 2018-10-09 23:38 +0200
  Re: Klassen rekursiv in einem Modul instantiieren Peter Otten <__peter__@web.de> - 2018-10-10 00:08 +0200
    Re: Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-09 22:21 -0700
      Re: Klassen rekursiv in einem Modul instantiieren Peter Otten <__peter__@web.de> - 2018-10-10 10:32 +0200
  Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Hartmut Goebel <h.goebel@goebel-consult.de> - 2018-10-10 09:29 +0200
    Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-10 09:51 -0700

csiph-web