Подтвердить что ты не робот

Как сделать "int" разобрать пустые строки?

У меня есть синтаксическая система для текстовых записей фиксированной длины на основе таблицы макетов:

parse_table = [\
    ('name', type, length),
    ....
    ('numeric_field', int, 10), # int example
    ('textc_field', str, 100), # string example
    ...
]

Идея состоит в том, что, учитывая таблицу для типа сообщения, я просто просматриваю эту строку и восстанавливаю из нее словарь, в соответствии с записями в таблице.

Теперь я могу обрабатывать строки и собственные целые числа, но int() не будет анализировать поля всех пространств (по уважительной причине, конечно).

Я хотел обработать его, указав подкласс int, который обрабатывает пустые строки. Таким образом, я мог бы пойти и изменить тип соответствующих записей таблицы, не введя дополнительные kludges в код синтаксического анализа (например, фильтры), и он будет "просто работать".

Но я не могу понять, как переопределить конструктор встроенного типа в подтип, поскольку определение конструктора в подклассе, похоже, не помогает. Я чувствую, что мне не хватает чего-то фундаментального здесь о том, как работают встроенные типы Python.

Как мне подойти к этому? Я также открыт для альтернатив, которые не добавляют слишком много сложности.

4b9b3361

Ответ 1

Используйте функцию factory вместо int или подкласс int:

def mk_int(s):
    s = s.strip()
    return int(s) if s else 0

Ответ 2

lenient_int = lambda string: int(string) if string.strip() else None
                                                          #else 0
                                                          #else ???

Ответ 3

Вы можете использовать функцию int() с аргументом s.strip() or 0, i.e:

int(s.strip() or 0)

Если s.strip() оценивается как ложное значение (как в случае с пустой строкой), тогда общее выражение s.strip() or 0 оценивается как 0.

Или, если вы знаете, что строка всегда будет содержать только цифры или пустая, то просто:

int(s or 0)

Ответ 4

обратите внимание, что mylist - это список, содержащий:

Кортежи и внутри кортежей есть I) нулевые/пустые значения, ii) цифры, цифры как строки, а также iii) пустые/нулевые списки. например:

mylist=[('','1',[]),('',[],2)]

@Arlaharen Я повторяю здесь, ваше решение, несколько иначе, чтобы добавить ключевые слова, потому что я потерял много времени, чтобы найти его!

Следующее решение - это удаление/преобразование нулевых строк, пустых строк или, иначе, пустых списков, как ноль, но сохранение непустых строк, непустых списков, содержащих цифры/числа в виде строк, а затем преобразование этих строк, как цифры/цифры.

Простое решение. Обратите внимание, что "0" можно заменить итерационными переменными. Обратите внимание, что первое решение не может ПРОСИТЬ пустые списки внутри кортежей.

int(mylist[0][0]) if mylist[0][0].strip() else 0

Я нашел еще более простой способ: ИТ может обрабатывать пустые списки в кортеже

int(mylist[0][0] or '0')

преобразовать строку в цифру/преобразовать строку в число/преобразовать строку в целое число strip empty list/strip empty string/обрабатывать пустую строку как цифру/номер преобразовать нулевую строку как цифру/число/преобразовать нулевую строку как целое