Я запускаю python 2.6 на Ubuntu Lucent и затрудняюсь корректно интерпретировать знак минус в отрицательных аргументах командной строки, особенно когда вызов сценария инициируется через ОС через Rails (с использованием backquotes). В частности, знак минус, похоже, входит в UTF-8.
Когда аргументы командной строки интерпретируются вручную, как в:
lng = float(sys.argv[4])
он вызывает ошибку:
ValueError: invalid literal for float(): ‐122.768
Как взломать, я могу обойти это, сопоставляя первые три байта как "\ xe2", "\ x80" и "\ x90" и заменяя их своим отрицательным знаком.
Когда аргументы командной строки интерпретируются через argparse (вер. 1.2.1), как в:
parser.add_argument('--coords', metavar='Coord', dest='coordinates', type=float, nargs=3, help='Latitude, Longitude, and Altitude')
он вызывает ошибку:
sC.py: error: argument --coords: invalid float value: '\xe2\x80\x90122.76838'
Любая помощь будет оценена!
Возможно, вам придется использовать свой взлом и сказать argparse, чтобы ожидать строку.
Что касается Python, ваша система и RoR -
и ―
никак не связаны. Если вы хотите решить эту проблему (вместо того, чтобы взломать ее), вы переходите к коду рельсов и смотрите, откуда он получает свои данные. Где-то вдоль линии интересный выход был важен.
Ваши входные данные содержат символ Unicode, который не является стандартным ascii-дефисом.
import unicodedata as ud
data = '\xe2\x80\x90122.76838'
unicode_data = data.decode('utf8')
print repr(ud.name(unicode_data[0]))
print repr(ud.name(u'-')) # An ascii hyphen
Вывод:
'HYPHEN'
'HYPHEN-MINUS'
Хотя они могут выглядеть одинаково при печати, это не так. Ограничьте или дезинформируйте ввод.
print float(unicode_data.replace(u'\N{HYPHEN}',u'-'))
Вывод:
-122.76838