Mein Programm soll etwas anderes tun, wenn die Python-Version kleiner als 2.6 ist. Gibt es einen besseren Weg als das?
Code: Alles auswählen
import sys
version = float(sys.version[:3])
if version < 2.6:
print 'kleiner'
Code: Alles auswählen
import sys
version = float(sys.version[:3])
if version < 2.6:
print 'kleiner'
Ist doch in Ordnung so. Du kannst natürlich auch sys.version_info verwenden. Wenn du es ganz anders haben willst, hätte ich noch diese Lösung anzubieten:snafu hat geschrieben: Mein Programm soll etwas anderes tun, wenn die Python-Version kleiner als 2.6 ist. Gibt es einen besseren Weg als das?Code: Alles auswählen
import sys version = float(sys.version[:3]) if version < 2.6: print 'kleiner'
Code: Alles auswählen
>>> try:
... (1,).count(1)
... except AttributeError:
... print "kleiner"
...
kleiner
Code: Alles auswählen
import sys
major, minor = sys.version_info[:2]
if major <= 2 and minor < 6:
print 'kleiner'
Code: Alles auswählen
if sys.version_info[:2] < (2, 6):
# ...
Code: Alles auswählen
Python 2.6 (r26:66714, Nov 16 2008, 20:39:17)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import imp
>>> imp.find_module('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named
>>>
Python 2.5.2 (r252:60911, Nov 14 2008, 19:46:32)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import imp
>>> imp.find_module('')
(None, '/usr/lib/python2.5/site-packages/PIL/', ('', '', 5))
Macht es nicht mehr Sinn zu kontrollieren ob der String leer ist?snafu hat geschrieben:EDIT: Obwohl, eigentlich ist das Unsinn. Die Meldung "No module named" ist ja ohnehin eher verwirrend. Ich werfe jetzt unabhängig von der Python-Version einen ImportError: "Module string is empty."
Wieso ist die Meldung verwirrend? Ist doch eine klare Aussage: "Es wurde kein Modul benannt." Das trifft doch exakt den Punkt.snafu hat geschrieben:EDIT: Obwohl, eigentlich ist das Unsinn. Die Meldung "No module named" ist ja ohnehin eher verwirrend. Ich werfe jetzt unabhängig von der Python-Version einen ImportError: "Module string is empty."
Mach ich ja auch jetzt:cofi hat geschrieben:Macht es nicht mehr Sinn zu kontrollieren ob der String leer ist?
Code: Alles auswählen
def get_path(module):
"Return module's path. Return None if module is no file."
if module == '':
raise ImportError, 'Module string is empty.'
f, path = imp.find_module(module)[:2]
if f == None:
return None
try:
return path
finally:
f.close()
Ah, verstehe: Die Meldung ist eigentlich gar nicht so gemeint wie ich das übersetzt habe, sondern eigentlich steht da "Es gibt kein Modul mit dem Namen <Argument>" und dann fehlt der Name, weil kein Argument übergeben wurde. Dann ist es wirklich nicht schön.snafu hat geschrieben:@numerix: Die Meldung an sich ist nicht verwirrend. Sie sieht nur komisch aus, wenn dahinter kein Name steht, weil der übergebene String eben leer ist.
Da offene Streams auf jeden Fall geschlossen werden sollten, wollte ich auch den sehr unwahrschenlich, aber theoretisch dennoch möglichen Fall einbeziehen, dass die print-Zeile eine Exception wirft. Schaden kann es IMHO jedenfalls nicht.Birne94 hat geschrieben:wieso wird da das return mit try abgefangen?
Um den Stream nach dem beenden der Funktion zu schließen? Denn ein Fehler kann da nicht so wirklich bei rauskommen, oder?
Code: Alles auswählen
def get_path(module):
"Return module's path. Return None if module is no file."
if module == '':
raise ImportError, 'Module string is empty.'
f, path = imp.find_module(module)[:2]
if f == None:
return None
f.close()
return path
Code: Alles auswählen
import time
for i in xrange(5000):
time.sleep(0.01)
print 'hello world'
Code: Alles auswählen
$ python broken_pipe.py | head -n5
hello world
hello world
hello world
hello world
hello world
Traceback (most recent call last):
File "/home/lunar/test/broken_pipe.py", line 5, in <module>
print 'hello world'
IOError: [Errno 32] Broken pipe
Okay, danke. War mir nicht bekannt.Leonidas hat geschrieben:Statt ``if f == None:`` besser ``if f is None`` denn ``None`` ist tatsächlich ein Singleton und man kann auf Objektidentität testen.
Vom "Datei-Objekt" kann man ja nicht mehr sprechen, da der Python-Interpreter zu diesem Zeitpunkt tot ist. Auf Betriebssystemebene werden die Ressourcen des Prozesses auf jeden Fall geschlossen, allerdings liegt zwischen dem Python-Interpreter und dem System noch die Standardbibliothek von C, die meist noch puffert. Dieser interne Puffer geht verloren, wenn sich das Programm nicht sauber beendet. Wenn man nur liest, ist das egal, weil der Puffer eh nur wiedergibt, was sich auf der Festplatte befindet.snafu hat geschrieben:@lunar: Selbst wenn ich jetzt mehrere Zeilen (z.B. für mehrere Module) ausgeben und diese Ausgabe tatsächlich durch ein Programm wie "head" begrenzen würde, dann wäre das Dateiobjekt aber in meinem Fall trotzdem geschlossen, bevor das print aus main() etwas in die Konsole schreibt, oder? Also jetzt bezogen auf die Variante ohne "finally".
In dem Sinne kannst du auch `if module == '':' anpassen -> `if not module:'Leonidas hat geschrieben:Statt ``if f == None:`` besser ``if f is None`` denn ``None`` ist tatsächlich ein Singleton und man kann auf Objektidentität testen.