Вопрос: Почему int (string) дает ошибку значения


Мне просто интересно, почему, когда я беру целое число строки типа int ('string'), почему вы получаете ошибку значения в python 3.2, а не ошибку типа. Я вижу, что определение типа ошибки определено на сайте python следующим образом: Поднимается, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение представляет собой строку, содержащую сведения о несоответствии типов.

не является int operator и строка является неподходящим типом? Когда я это делаю, я получаю ValueError и не понимаю причину этого.

Вот код Поэтому, когда я создаю экземпляр класса с рангом, у которого есть строка, чтобы попытаться получить ошибку, я получаю значениеerror, а не тип, как я ожидал бы.

class Card:

#attributes
list_rank=   ["","Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"]
list_suit={"d":"diamonds","c":"clubs","h":"hearts","s":"spades"}

#initialize rank and suit
def __init__(self,rank,suit):



self.rank=int(rank)

self.suit=suit




#return the rank of the card
def getRank(self):
    return(self.list_rank[self.rank])

#return the suit of the card
def getSuit(self):
    return(self.list_suit[self.suit])



#value of the cards
def bjValue(self):
    if(self.rank<10):
        return(self.rank)
    else:
        return(10)


#return the rank and suit of the card
def __str__(self):

    return (self.list_rank[self.rank]+" of "+self.list_suit[self.suit])

3


источник


Ответы:


Чтобы понять разницу, вы должны понимать разницу между типом и стоимостью. Тип «abc» - это строка, которую вы можете проверить, выполнив

type("abc")  # -> string

Значение литерала "abc" это просто сама ценность. Если бы у вас было выражение типа "ab" + "c" значение также будет "abc",

Вот почему вы получаете ValueError а не TypeError; int  надеется   string, которые вы ему дали - так что это правильный тип, но value должен быть чем-то, что можно интерпретировать как целое и "abc" не является целым числом.

Чтобы попробовать это, посмотрите разницу между:

int('abc')
# throws:
# ValueError: invalid literal for int() with base 10: 'abc'

а также

int(None)
# throws:
# TypeError: int() argument must be a string or a number, not 'NoneType'

Дело в том, что "abc" не сразу выглядит как целое, не мешает нам интерпретировать его как одно. В другом база  его все равно можно интерпретировать как число.

Например: двоичные числа, как вы, вероятно, знаете, используйте только 0с и 1s и шестнадцатеричные числа обычно представляются с использованием цифр 0 - 9 и буквы a - f, int функция принимает необязательный аргумент, который сообщает, какую базу использовать, поэтому, если мы попробуем интерпретировать "abc" снова, но как шестнадцатеричное число, получаем:

int('abc',  base=16)
# returns 2748

4



так как int() принимает строку как параметр, например int('1') выйдет 1, так '1' является приемлемым значением, но 'a' не является


2



TL; DR: вы получаете ValueError если данные, которые вы поставляете, являются правильными тип  для функции, которую вы пытаетесь использовать, но значение  не имеет смысла. Вы получаете TypeError если функция, которую вы пытаетесь использовать, не понимает, что делать с тип  данных, которые вы поставляете.

Примеры:

Например:

int('123') 
>>>>123

int('somestring')
>>>>Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: 'somestring'

поэтому он пытается преобразовать строку в int, используя base 10, где только символы 0-9 имеют смысл. В основном Python говорит: «Я ожидал строку, но я не понимаю, что строка»

Сравните это с этим:

>>>>int('FF', base=16)  #hexadecimal
255

>>>>int('9', base=8) # can only use 0-7 in octal
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'somestring'


>>>>int('somestring', base=36)
2913141654103084L

(База 36 использует 0-9, затем a-z в качестве действительных числовых символов)

Если вы попытаетесь использовать неправильный тип полностью, например int( {'apple':1} ) то вы получаете TypeError и полезное сообщение о том, почему оно не сработало:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'dict'

1