2013-06-27 4 views
0

У меня есть сценарий, который я пытаюсь собрать вместе. Он делает много перетасовки чисел и еще много чего, он записывает использование ресурсов на локальном компьютере. Я повесил трубку на части скрипта. Я пытаюсь создать int из части строки. Вот проблемная часть сценария ...Тип STR не меняется на INT в Python 2.7

j = item[11:len(item)] 
if j.endswith("L"): 
    j = int(j[0:len(j)-1]) 
print type(j) 

элемента является строкой, которая получается из длинного ряда струнной нарезки/расщепления. В этом случае элемент будет похож на нечто похожее на это: «bytes_recv = 3829381938203L» или «bytes_recv = 1302». Эти четыре строки обрезают не десятичные символы, а затем удаляют конечный L, если они есть, а затем печатают тип переменной J, которая в моей голове должна быть целым числом из-за третьей строки в моем коде, где она устанавливает ее в int с int(). Когда я запускаю скрипт, он никогда не перестает говорить мне, что переменная типа j является «str». Это делает мой сценарий бросить на себя, когда она попадет эту следующую строку коды,

sndf = int(((float(int(j) - ndic[nds][len(ndic[nds])-1])/1024)/1024)) 

NDIC словарь содержит работает списки точек данных от мониторинга ресурсов для использования в графиках позже. Эта строка кода берет последнюю запись из списка словаря и вычитает ее из нашего значения j, а затем разделяет эту сумму на 1024, дважды. Я не думаю, что вышеуказанная строка кода способствует ошибке, но может быть, я включил ее. Вот ошибка, которую я получаю при выполнении сценария:

TypeError: unsupported operand type(s) for -: 'int' and 'str' 

Получаю эту ошибку в строке кода sndf =.

ответ

2

Проблема, вероятно, заключается в том, что вы не конвертируете j в int, если он не заканчивается "L".

Когда я запускаю скрипт с item = 'bytes_recv=3829381938203L', он отлично работает, и j является int, но с item = 'bytes_recv=1302', код в блок, если не выполняется, поэтому преобразование не выполняется.

Если вы используете long() вместо int(), вы можете оставить "L" там и даже не нуждаются в if заявление:

j = long(j[0:len(j)]) 
+0

Согласовано. Как правило, я склонен рассматривать все логические возможности и разбираться с ними явно, поэтому ничего не забывается. Это означает больше строк кода, но это также означает меньшую двусмысленность в отношении вещей, которые не были рассмотрены. – ericmjl

+0

Это не то, что вызывает исключение, потому что он вызывает 'int (j)' на линии, которая делает вычитание. – interjay

+0

Хорошая мысль, я не обратил на это внимания. – omz

3

Python не магически конвертирует типы. ndic[nds][len(ndic[nds])-1] также является строкой.

+0

Я уверен, жаль, что это будет. – 0xhughes

+4

@ 0xhughes Автоматическое приведение типов из строк - это плохая идея - это одна из многих вещей, которая делает PHP уязвимой. –

+0

Итак, мне сказали, что int не волшебный создатель int, и что автоматическое typecasting - плохая идея. Я ценю эту информацию, но как вы из лучших джентльменов предлагаете мне подумать о приближении этих строк кода? – 0xhughes

Смежные вопросы