2013-03-15 2 views
0

Во время работы над школьным проектом. Я столкнулся с этой ошибкойПочему Python интерпретирует эту переменную как int, если я инициализирую ее как строку?

>>> y = tokens.numberToken('1.23') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "tokens.py", line 10, in __init__ 
    self._value = v 
ValueError: invalid literal for int() with base 10: '1.23' 

Я проследил его обратно в этот раздел кода

class token: 
    def type(self): 
     return "UNDEF" 
    def getValue(self): 
     pass 

class numberToken(token): 
    _value = "0.0" 
    def __init__(self, v = "0.0"): 
     self._value = v 
    def type(self): 
     return "num" 
    def getValue(self): 
     try: 
      r = int(_value) 
     except ValueError: 
      r = float(_value) 
     return r 

я понял, что в ПолучитьЗначении (сам) _value должно быть self._value. Я решил, что это, вероятно, не связано, однако при перезагрузке модуля код отлично работает.

Итак, мой вопрос в том, почему python попытался преобразовать введенную строку как int и почему изменилось значение _value на self._value в другой функции, исправьте код?

+2

Используя пример, который вы указали с введенным кодом, не вызывает ошибки. – BrenBarn

ответ

0

Ваш getValue действительно ошибается. Чтобы использовать _value в своем классе, вам нужно ввести self._value, таким образом вы используете _value для этого экземпляра вашего класса. И именно поэтому он работает, когда вы меняете его.

Таким образом, он ищет _value, определяемый как глобальный. Или вы можете передать его в качестве аргумента для метода при вызове и его использовании.

def getValue(self, _value): 
    try: 
     r = int(_value) 
    except ValueError: 
     r = float(_value) 
    return r 

Для справки посмотрите на http://docs.python.org/2/tutorial/classes.html

Это пример из документации, где вы можете увидеть, как данные и индекс используются в классе.

class Reverse: 
    """Iterator for looping over a sequence backwards.""" 
    def __init__(self, data): 
     self.data = data 
     self.index = len(data) 
    def __iter__(self): 
     return self 
    def next(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index = self.index - 1 
     return self.data[self.index]