str()-Funktion

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

Mittwoch 11. März 2009, 15:18

Hallo zusamen

Ich habe ein kleines Skript (main_trick.py) mit:

Code: Alles auswählen

import odbchelper

if __name__ == '__main__':
    print("main-test.")
    
print(str(odbchelper))    

wobei odbchelper ein Modul ist (odbchelper.py). Die print(str(...))-Funktion gibt jetzt den Verzeichnispfad auf der Festplatte aus. Wie ist es möglich, mit str(...) den Verzeichnispfad des main_script.py-Moduls selber auszugeben?

Insbesondere (und ich denke, dass würde mir wirklich für das Verständnis der Sprache helfen), verstehe ich die Fehlermeldung nicht, wenn ich noch die Zeile

Code: Alles auswählen

print(str(main_trick.py))
einfüge. Dann wird behauptet, dass
NameError: name 'main_trick' is not defined
. Ich verstehe irgendwie nicht, wieso sich das Modul nicht selber erkennt.
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 11. März 2009, 15:23

str() ist keine Funktion. Wenn man str() ein Objekt übergibt bekommt man auch nicht den Pfad oder was auch immer sondern die string Repräsentation des Objekts. Den Pfad bekommt man über dass __path__ Attribut heraus, allerdings ist ein Modul nicht zwangsläufig eine Datei sodass dies nicht immer zu einem Ergebnis führt.

Im Namespace eines Moduls befindet sich keine (direkte) Referenz auf dass Modul selbst, dass ist eben so.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 11. März 2009, 15:26

@DasIch:

"str" ist eine Funktion.
Das Leben ist wie ein Tennisball.
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 11. März 2009, 15:30

Da sagt help(str) aber was anderes.
Benutzeravatar
snafu
User
Beiträge: 5497
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 11. März 2009, 15:45

EyDu hat geschrieben:"str" ist eine Funktion.
Dann würden aber etliche Operationen an String-Objekten nicht funktionieren. ;)
shcol (Repo | Doc | PyPi)
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Mittwoch 11. März 2009, 15:46

@DasIch:

http://www.diveintopython.org/power_of_ ... tions.html

Kannst du ein Beispiel machen, wie ich __path__ im Code oben einbauen müsste, um die String-Repräsentation des Pfades des (hier in der Tat ein Modul) Moduls main_trick.py zu erhalten?
Wie müsste man str() dann nennen?
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 11. März 2009, 16:14

snafu hat geschrieben:Dann würden aber etliche Operationen an String-Objekten nicht funktionieren. ;)

Code: Alles auswählen

In [1]: def mystr(obj):
   ...:     return str(obj)
...und jetzt ist mystr eine Klasse? So einfach ist dass dann doch nicht.

Hab mich übrigens vertan, das __path__ Attribut haben nur Pakete. Module haben ein __file__ Attribut über dass man den Dateinamen bekommt.

Code: Alles auswählen

bash-3.2$ touch foo.py
bash-3.2$ python      
Python 2.6.1 (r261:67515, Mar  9 2009, 03:38:08) 
[GCC 4.3.3] on linux2                            
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo                                                        
>>> foo.__file__
'foo.py'
Allerdings auch hier gilt:

Code: Alles auswählen

>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined
Benutzeravatar
snafu
User
Beiträge: 5497
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 11. März 2009, 16:16

Code: Alles auswählen

import os
print os.path.abspath('main_script.py')
shcol (Repo | Doc | PyPi)
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Mittwoch 11. März 2009, 16:16

DasIch hat geschrieben: Allerdings auch hier gilt:

Code: Alles auswählen

>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined
Würde das nicht mit

Code: Alles auswählen

__main__.__file__
funktionieren?

PS: Falls das etwas ausser in print-Statements ändert: Es geht um Python 3.0.1.
Benutzeravatar
snafu
User
Beiträge: 5497
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 11. März 2009, 16:20

DasIch hat geschrieben:...und jetzt ist mystr eine Klasse?
Nö. Davon war aber auch nicht die Rede.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5497
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 11. März 2009, 16:29

In Python 3:

Code: Alles auswählen

import os
print(os.path.abspath(__file__))

Code: Alles auswählen

~$ p3k test.py
/home/sebastian/test.py
shcol (Repo | Doc | PyPi)
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 11. März 2009, 16:34

mzh hat geschrieben:Würde das nicht mit

Code: Alles auswählen

__main__.__file__
funktionieren?
Jein. Das geht zwar:

Code: Alles auswählen

bash-3.2$ cat foo.py
print __file__
bash-3.2$ python foo.py
foo.py
aber dass nicht:

Code: Alles auswählen

In [1]: from types import ModuleType

In [2]: foo = ModuleType('foo')

In [3]: foo
Out[3]: <module 'foo' (built-in)>

In [4]: foo.__file__
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

/home/dasich/<ipython console> in <module>()

AttributeError: 'module' object has no attribute '__file__'
Antworten