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

Donnerstag 16. April 2009, 08:49

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

Donnerstag 16. April 2009, 08:52

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

Donnerstag 16. April 2009, 09:10

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: 5495
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 16. April 2009, 09:40

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)
shcol (Repo | Doc | PyPi)
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Donnerstag 16. April 2009, 10:41

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: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 16. April 2009, 11:46

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

Donnerstag 16. April 2009, 12:09

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

Donnerstag 16. April 2009, 12:18

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

Donnerstag 16. April 2009, 12:36

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

Donnerstag 16. April 2009, 13:20

@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
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 16. April 2009, 14:16

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Donnerstag 16. April 2009, 14: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
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 16. April 2009, 14:56

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Donnerstag 16. April 2009, 15:28

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
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 16. April 2009, 15:34

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten