Seite 1 von 1

str()-Funktion

Verfasst: Mittwoch 11. März 2009, 15:18
von mzh
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.

Verfasst: Mittwoch 11. März 2009, 15:23
von DasIch
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.

Verfasst: Mittwoch 11. März 2009, 15:26
von EyDu
@DasIch:

"str" ist eine Funktion.

Verfasst: Mittwoch 11. März 2009, 15:30
von DasIch
Da sagt help(str) aber was anderes.

Verfasst: Mittwoch 11. März 2009, 15:45
von snafu
EyDu hat geschrieben:"str" ist eine Funktion.
Dann würden aber etliche Operationen an String-Objekten nicht funktionieren. ;)

Verfasst: Mittwoch 11. März 2009, 15:46
von mzh
@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?

Verfasst: Mittwoch 11. März 2009, 16:14
von DasIch
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

Verfasst: Mittwoch 11. März 2009, 16:16
von snafu

Code: Alles auswählen

import os
print os.path.abspath('main_script.py')

Verfasst: Mittwoch 11. März 2009, 16:16
von mzh
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.

Verfasst: Mittwoch 11. März 2009, 16:20
von snafu
DasIch hat geschrieben:...und jetzt ist mystr eine Klasse?
Nö. Davon war aber auch nicht die Rede.

Verfasst: Mittwoch 11. März 2009, 16:29
von snafu
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

Verfasst: Mittwoch 11. März 2009, 16:34
von DasIch
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__'