Почему int(string) выдает ошибку значения

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

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

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

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])

person user3630439    schedule 12.02.2015    source источник
comment
у каждого символа есть целое число, называемое ASCII, вы знаете об этом?   -  person m0bi5    schedule 12.02.2015
comment
Что бы это ни стоило, Python 2.x также поднимает ValueError.   -  person Frerich Raabe    schedule 12.02.2015
comment
Вы на самом деле применяете эту функцию к чему-нибудь?   -  person SierraOscar    schedule 12.02.2015
comment
int не оператор, это встроенный класс. И когда вы вызываете int(x), вы вызываете конструктор этого класса.   -  person Frerich Raabe    schedule 12.02.2015
comment
Для справки, получение TypeError не поможет вам, если вы пытаетесь сделать int("Ace")   -  person David Reeve    schedule 12.02.2015
comment
Не знал, что у каждого символа есть целое число, называемое ASCII. Спасибо.   -  person user3630439    schedule 12.02.2015
comment
Обратите внимание, что 'string' является допустимым числом по основанию 36, т. е. int('string', base=36) оценивается как 1743045676 (десятичное). ;-)   -  person Frerich Raabe    schedule 12.02.2015
comment
@FrerichRaabe спасибо за добавление к общей путанице: D   -  person André Laszlo    schedule 12.02.2015
comment
Спасибо всем за помощь.   -  person user3630439    schedule 12.02.2015


Ответы (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" не сразу выглядит как целое число, не мешает нам интерпретировать его как единицу. В другой базе это все еще может интерпретироваться как число.

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

int('abc',  base=16)
# returns 2748
person André Laszlo    schedule 12.02.2015
comment
Огромное спасибо. Теперь это имеет гораздо больше смысла. Я действительно не думал, я думаю. Спасибо еще раз. - person user3630439; 12.02.2015

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

person muhammedabuali    schedule 12.02.2015
comment
@user3630439 user3630439 Дело в том, что передача строки конструктору int не является ошибкой типа — многие строки допустимы (например, "12345"). Таким образом, возникновение ошибки типа для строки не имеет смысла (но возникновение ошибки типа, например, для None вполне правдоподобно, как демонстрирует Андре Ласло). - person Frerich Raabe; 12.02.2015
comment
потому что 'a', как я уже сказал, является неправильным значением, поскольку это не целое число, а '1' является допустимым значением. имейте в виду, что оба имеют один и тот же тип - person muhammedabuali; 12.02.2015
comment
Ах, это имеет смысл. Огромное спасибо! - person user3630439; 12.02.2015

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, используя базу 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

(Base 36 использует 0-9, а затем az как допустимые числовые символы)

Если вы попытаетесь полностью использовать неправильный тип, например 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'
person Danny    schedule 12.02.2015
comment
Спасибо за отличное объяснение! Очень признателен! - person user3630439; 12.02.2015