Jan
26
2011
0

[update] Python OptionParser: invalid integer value

Nachdem ich mich gewundert habe, warum bei mir jeweils zwei Kanäle meiner Daten (Kanal 08 und 09) nicht berechnet worden sind, habe ich die Jobs per Hand gestartet und stieß auf folgendes Phänomen:

Man nehme folgende minimal.py:


#!/usr/bin/python
# -*- coding: utf8 -*-
# minimal example by H.Dickten 2011

from optparse import OptionParser
parser = OptionParser()

parser.add_option("-c", "--channel1", type = int, dest="ch1",default = -1,
help = "channel 1")
parser.add_option("-C", "--channel2", type = int, dest="ch2",default = -1,
help = "channel 2")

(options, args) = parser.parse_args()
parser.destroy()
print "Channel1 = %d, Channel2 = %d. EXIT.\n" % (options.ch1, options.ch2)

und führe folgende test.sh aus:

#!/bin/bash
for i in 6 06 7 07 8 08 9 09 10
do
echo "i = $i"; python minimal.py -c 1 -C $i
done

Phänomen:
Wie man sieht werden alle Zahlen (mit und ohne vorstehenden Nullen) wunderbar als int geparsed. Nur die Zahl 08 und 09 werden nicht als 8 und 9 erkannt.

Abhilfe:
Man lässt die Zahlen als string parsen und castet diese später auf int via:

options.ch1 = int(options.ch1)

Gestestet mit Python 2.6.6 (debian squeeze) und Python 2.6.5 (Windows 7)

Update:
Python interpretiert “08″ als Oktalzahl (Quelle: docs.python.org). Demnach werden Hex- und Binärzahlen mit dem Präfix “0x” bzw. “0b” gekennzeichnet; Oktalzahlen jedoch nur mit der Ziffer “0″ anstelle der eindeutigen Kette “0o”. Dies sollte geändert werden ist wohl in Python 3 geändert worden, damit Zahlen nicht falsch interpretiert werden können (z.B. 072 (dezimal) != 072 (oktal) = 0o72 = 58 (dezimal)).

Powered by WordPress | Aeros Theme | TheBuckmaker.com | Original background by Dino Abatzidis | modified by H.Dickten