import aus loop?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LeaRn
User
Beiträge: 2
Registriert: Dienstag 29. Juni 2021, 07:56

Geehrter Leser.

Ich bekomme eine Fehlermeldung (# import package from short; SyntaxError: invalid syntax), wenn ich Pakete mit einem Loop einlesen will:

Code: Alles auswählen

pkgs = {
        "package": ["pandas", "numpy"],
        "short": ["pd", "np"]
        }

for i in range(1, len(pkgs)):
    package = pkgs.get("package")
    short = pkgs.get("short")
    import package[i] from short[i]
Ich habe es schon mit eval() und exec() probiert, was aber nicht zur Lösung des Problems führte. Falls sich jemand meinem Problem annimmt: Ich wäre sehr froh um eine Erklärung, wieso mein Code nicht funktionieren kann. (Die Ineffizienz des Loop bin ich mir bewusst.)
Vielen Dank schon im Voraus.
LeaRn

PS: Dass dieser Loop im Allgemeinen keine gute Idee ist, bin ich mir bewusst.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ist vieles im Argen. Falsches iterieren, falsches zugreifen mit 1-basiertet Logik, und das Wichtigste zum schluss: es ist doch sinnlos, das zu machen. Schreib Deine Import statements einfach an den Beginn des Skriptes. Denn selbst wenn das was du da treibst zum funktionieren gebracht wird (das geht mit einem Modul aus der Standard Bibliothek), ist es doch komplett sinnfrei. Denn du schaffst dadurch nicht die Namen, die du brauchst, um damit darauf zuzugreifen.

Was ist denn der Grund, warum du so vorgehen willst?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Es muß `as` heißen und so aussehen:

Code: Alles auswählen

import numpy as np
import pandas as pd
Die Datenstruktur muß so aussehen

Code: Alles auswählen

packages= [
    {"package": "pandas", "short": "pd"},
    {"package": "numpy", "short": "np"},
]
for package in packages:
    print(f"hier soll was magisches passieren: import {package['package']} as {package['short]'}")
Solange Du keine vernünftige Erklärung lieferst, warum Du eine Schleife brauchst, wird Dir hier aber niemand schreiben, was das magische sein könnte.
LeaRn
User
Beiträge: 2
Registriert: Dienstag 29. Juni 2021, 07:56

Danke für Eure Antworten. Wie schon gesagt, der Code ist sinnfrei und ich will ihn gar nicht erst zum laufen bringen, sondern suche nur eine Erklärung, wieso die Import-Funktion nicht in der Schleife funktioniert (Ich habe schon das help() der Funktion angeschaut, habe da aber keinen Grund gefunden). Das mit dem "as" und dem Beginn mit 0 sehe ich natürlich ein.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

`import` ist keine Funktion, sondern ein Statement. Daher kann man da auch nicht mit Variablen arbeiten.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sirius3 hat geschrieben: Dienstag 29. Juni 2021, 10:50 `import` ist keine Funktion, sondern ein Statement. Daher kann man da auch nicht mit Variablen arbeiten.
Gut das `if` eine Funktion ist, man stelle sich vor es wäre ein Statement und man könnte keine Variablen darin nutzen ;)

Das `import "foo"` oder `import foo as "bar"` nicht geht ist einfach konsequent, schliesslich haben Zuweisungen sonst immer Variablen/Namen als Ziel wie z.b. bei `foo = "bar"`, `for element in elements`, `except Exc as error` usw. Das liesse `import "foo" as bar` allerdings zu, wäre aber irgendwie komisch dies zu erlauben und die anderen Varianten nicht.
Antworten