2013-07-18 2 views
1

Таким образом, у меня есть эта строка коды:Тип ошибка при использовании переменных

fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(fc_no_rocks/100, 3) 

, который принимает в переменном, типе которого должен быть поплавком. Когда я проверить тип переменной, используя тип(), он возвращает:

>>>type(fc_no_rocks) 
<type 'float'> 

, но я получаю сообщение об ошибке: «неподдерживаемые типы операндов для /:. Обл и междунар

+0

Можете ли вы предоставить автономный пример? –

+1

Вы на 100% уверены, что ошибка исходит из этой строки? – SethMMorton

+0

Что вы подразумеваете под самодостаточным примером; и да. – Dylansq

ответ

1

Был цикл for, который изменил переменные, поэтому для fc_no_rocks установлено значение None. Это сделало логику при установке переключателя переменной fc влево, где одна из переменных, которые я заменила, также была строкой. извините за перемешивание

1

Почему не просто убедитесь, что fc_no_rocks поплавковый?

fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(float(fc_no_rocks)/100, 3) 
+1

Если его fc_no_rocks содержит нечисловое значение, это не принесет пользы –

+0

, но это не должно быть str. проверка типа() возвращается как float .. – Dylansq

+0

, но ошибка говорит иначе :) И, с более критическим взглядом, все, что я говорю, это не заставить typecasts, если вы действительно не знаете, что происходит. –

0

существует одна вещь. round((1+5*100)/100, 3) нет ничего округлить, так как числовые литералы все целые числа и результат этого целого уравнения (1+5*100)/100, который включает в себя divisio n = , а не 5.01 как и следовало ожидать. Чтобы восстановить его, вы должны использовать все десятичные литералы в каждом из ваших десятичных расчетов:

round((1.0+5.0*100.0)/100.0, 3) 

EDIT: Отремонтированное заявление приведет к 5.01, так что вы должны быть осторожны в других частях кода.

+0

Хорошая точка! ;-) – tamasgal

+3

Если это не python3, и в этом случае float возвращаются при делении – SethMMorton

+0

, я удалял другие переменные int, чтобы немного очистить его; извините – Dylansq

3

Очевидно, fc_no_rocks - это строка в вашем случае. Эта ошибка на вас. Лучше, чтобы проверить несколько случаев:

  1. fc_no_rocks ряд
  2. fc_no_rocks является строка, указывающая номер
  3. fc_no_rocks является ни один из выше

Вы убедитесь, что fc_no_rocks ISN 't None, но это могло быть ничего. Поэтому сначала лучше проверить более эксклюзивно, а затем пусть ваш случай else станет уловкой, то есть ни/ничем из вышеперечисленного.

В одном большом беспорядке трехкомпонентной цепи, то это:

fc = round(float(fc_no_rocks)/100.0, 3) if isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3) 

Лучше писать в нескольких строках, им, но однострочечники такие интересно писать. Это как положить ведро с водой на дверь, которую ты знаешь, кто-то еще собирается пройти. Это отстойно быть человеком, поддерживающим ваш код ...! (Кстати, убедитесь, что вы покинули свою работу после написания такого рода материалов, чтобы вам не нужно было поддерживать его.)

Во всяком случае, выход:

>>> fc_no_rocks = "2.3" 
>>> fc = ... 
>>> fc 
0.023 
>>> fc_no_rocks = "foobar" 
>>> fc = ... 
>>> fc 
5.01 
>>> fc_no_rocks = 1.3 
>>> fc = ... 
>>> fc 
0.013 
>>> fc_no_rocks = 6340 
>>> fc = ... 
>>> fc 
63.4 

Если вы хотите отлаживать прямо в середине этого заявления, у меня есть хорошие новости:

>>> import sys 
>>> fc_no_rocks = "foobar" 
>>> fc = round(float(fc_no_rocks)/100.0, 3) if sys.stdout.write(str(type(fc_no_rocks))+"\n") or isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3) 
<type 'str'> 
>>> fc 
5.01 

Вы можете злоупотребить логическое поведение or оператора и тот факт, что метод write() всегда возвращает None! Ура! Вы также можете написать repr(fc_no_rocks), если вы хотите увидеть его представление - полезно для получения как содержимого строки, так и указания, что да, это строка.

Редактировать: Я запускаю Python 2.7.2, поэтому мне пришлось добавить десятичные точки, чтобы разделить их правильно. Woops!

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