2017-11-24 9 views
2

Gibt es einen Punkt, da beide Wildcard zu importieren und nicht-Wildcard Weise wie:Gibt es einen Punkt, um das gleiche Modul auf zwei verschiedene Arten in einem Programm zu importieren?

import spam as sp 
from spam import * 

im gleichen-Datei?

+2

verwenden verwenden es hängt davon ab, was Sie tun wollen. In Ihrem zweiten Import können Sie es nicht als 'sp. verwenden. Nicht das' import * 'ist manchmal zweifelhaft. Siehe hierzu [Antwort] (https://stackoverflow.com/questions/2360724/what-exactly-does-import-import). – scharette

+2

Erfahrenere Programmierer, die das Programm gelesen haben, wissen, dass der Autor das Skript erstellt hat, indem er Dinge aus zufälligen Orten zusammenfügt und nicht wirklich weiß, was sie tun. :) –

+1

Siehe auch https://stackoverflow.com/questions/2386714/why-is-import-bad –

Antwort

4

Wenn Sie Spam als sp importieren, stellen Sie sicher, dass es keine Konflikte mit anderen Importbefehle:

import spam as sp 
import myfunctions as my 

sp.foo() 
my.foo() 

Dies funktioniert wie erwartet, aber das ist nicht:

from spam import * 
from myfunctions import * 


foo() 
foo() #Which foo() is meant? UNCLEAR!!! 

Wenn Sie dieses Problem vermeiden, indem Sie import spam as sp verwenden, warum möchten Sie from spam import * sowieso verwenden? Ich glaube nicht, dass das einen Sinn hat.

2

Nr Da Sie spam mit Namen sp und dann importiert alles mit from spam import *sp und wird nie ist daher nicht notwendig, verwendet werden importiert haben.

Zum Beispiel, wenn wir eine Funktion namens somefunction() haben. import spam as sp würde bedeuten, wir somefunction() mit sp.somefunction()

Seit from spam import * nennen könnte es direkt aufgerufen werden können somefunction() so sp.somefunction() warum verwenden statt.

from spam import * gilt als extrem schlechte Praxis. Sie sollten jede Funktion einzeln importieren, anstatt dies zu tun. (from spam import somefunction, from spam import someotherfunction und so weiter). Oder Sie könnten einfach sp.somefunction(), sp.someotherfunction() verwenden.

3

Der einzige Grund, warum ich denken konnte, ist, dass Sie Änderungfrom spam import *-import spam as sp wollen. Wenn Sie nur diese Zeilen ersetzen würden, würde es sofort den Code brechen, Sie müssten alles mit sp. voranstellen. Wenn Sie dies langsamer machen möchten, können Sie dies tun. Dann können Sie langsam die sp. wo erforderlich hinzufügen und schließlich die from spam import * entfernen.

2

import spam as sp lädt das Modul und legt es in die Variable sp. from spam import * lädt das Modul und alle seine Attribute (Klassen, Funktionen, etc ...) und auch die, die mit einem Platzhalter in spam importiert werden, werden zugänglich sein.

import * ist eine Abkürzung, wenn Sie viele Klassen haben, Funktionen, auf die Sie zugreifen müssen. Aber es ist eine schlechte Übung (siehe PEP), da Sie importierte Attribute nicht in einen Namespace kapseln (und das machen Sie mit import spam as sp) und kann zu unerwünschtem Verhalten führen (wenn 2 Funktionen in Ihrem Hauptprogramm und in Spam denselben Namen haben))

die beste Praxis, und was eindeutig fest, was Sie verwenden werden, ist from spam import func1, func2 oder wenn Sie es viel import spam as sp und sp.func1()

Verwandte Themen