join/join?

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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen

Wenn ich

Code: Alles auswählen

from os.path import join
join("C:\Arbeit", "Projekte")
schreibe, funktioniert das ausgezeichnet. Es gibt ja aber auch noch eine string-Funktion "join".

Code: Alles auswählen

" ".join([str(i) for i in range(5)]).
Was ist der Mechanismus dahinter, dass in beiden Fällen die richtige Funktion aufgerufen wird? Bzw. ist das immer so?
[url=http://www.proandkon.com]proandkon.com[/url]
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Naja, im Falle des Strings ist join() eine Methode des String-Objektes. Im Falle von os.path.join() ist es eine Methode des path-Objektes, die du über den Import in den Namensraum deines Modules überträgst (ich hoffe, ich habe das jetzt richtig dargestellt).

Auf alle Fälle ist die Zugehörigkeit im Falle der Strings völlig offensichtlich, da du das dazugehörige Objekt ja vorweg angegeben hast.

brb
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Du siehst den Unterschied auch, wenn Du die Methoden nicht ausführst sondern lediglich ihre String-Repräsentation anzeigen lässt.

Code: Alles auswählen

In [38]: import os.path

In [39]: os.path.join
Out[39]: <function join at 0xb7df733c>

In [40]: "".join
Out[40]: <built-in method join of str object at 0xb7dbc098>
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Strings sind in Python eigene Klassen. Das zweite `join()` ist halt die Methode der Stringklasse. Du kannst dir das z.B. angucken mit:

Code: Alles auswählen

dir(str)
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Du musst auch beachten _wie_ du die Funktionen aufrufst.

Einmal als string.join womit man immer die Methode join von string meint. Allgemein gesagt: bei objekt.methode bezieht sich methode immer auf objekt und existiert nur in diesem Zusammenhang und hat dann auch nichts mit (vermeintlich - denn der Name ist string.join und nicht nur join) gleichnamigen anderen Funktionen zu tun.
Und beim anderem mal rufst du join(argument) auf, womit du eine Funktion aufrufst, die sich auf kein Objekt bezieht.

(Edit: joint -> join* ;) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Damit es aber noch weniger Verwirrung gibt, importe ich das immer so:

Code: Alles auswählen

from os.path import join as osjoin
Hatte ich hier bei jemandem aus dem Board mal gelesen und gleich für mich übernommen.
BlackJack

Eigentlich wäre ja `path_join` ein passenderer Name, es werden ja keine Betriebssysteme verbunden, sondern (Teil)Pfade. ;-)

Allerdings kann man dann auch `from os import path` schreiben und `path.join` zum Aufruf verwenden. Ich benutze in der Regel immer den kompletten Namen `os.path.join` zum Aufrufen. Sooo lang ist das ja nun auch nicht.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Gibt es eigentlich ladezeitmäßig einen Unterschied zwischen `import os.path` und `from os.path import ...`?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Eigentlich wäre ja `path_join` ein passenderer Name, es werden ja keine Betriebssysteme verbunden, sondern (Teil)Pfade. ;-)
Stimmt! :-)
BlackJack

@Dauerbaustelle: Nein, in beiden Fällen muss das ganze Modul geladen werden. Die Frage ist nur was unter welchem Namen im importierenden Modul gebunden wird.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich importiere generell nur "os" und nichts spezielles daraus...

Es gibt auch eine Regel, die besagt, das man nur Module imporieren sollte, aber nichts daraus... IMHO kommt das aus dem Styleguide von google.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

@jens: aber in manchem Fällen doch wenig sinnvoll? Sobald es sich um längere Namen und verschachtelte Module handelt. Dann bin ich schon am Zeilenende bevor der Name ausgeschrieben ist... (das ist bei os sich kein Problem)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nö, denke nicht... Hast du Beispiele?

os.path.join im Quellentext ist auch einfacher lesbar, als einfach nur ein join und man erstmal nicht weiß, wo es herkommt...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

jens hat geschrieben:Nö, denke nicht... Hast du Beispiele?
Naja sowas wie

Code: Alles auswählen

import django.contrib.admin.views.decorators
ist durchaus so

Code: Alles auswählen

from django.contrib.admin.views import decorators
besser lesbar- und nutzbar ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, django ist da was extremer... Ich würde natürlich nicht auf die Idee kommen deine erste Varianten zu machen ;)

Aber ich importiere auch nicht immer nur den letzten Teil ;) Was in django selber glaube ich nur gemacht wird...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jens hat geschrieben:Ja, django ist da was extremer...
Beim Erstellen von Gui's i.d.R. auch. Es gibt also schon ein paar Beispiele.

Aber ich gebe dir schon irgendwo recht. Auch ich habe ganze gerne wenigsten eine "Punktebene" dazwischen.
BlackJack

Ist aber auch kein Beispiel gegen jens' Aussage nichts aus Modulen zu importieren, denn `decorators` ist doch wahrscheinlich selbst wieder ein Module, oder?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Auf jeden Fall gibt es Sachen, wo's einfach zu lang wird. In 90% der Fälle würde ich es auch so wie jens machen.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

from * import *
;)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

@audax: Ich habe gerade ernsthaft ausprobiert, ob das funktioniert^^
Antworten