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

...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
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
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
Verfasst: Mittwoch 11. März 2009, 16:34
von DasIch
mzh hat geschrieben:Würde das nicht mit
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__'