Ответ 1
Используйте функцию factory вместо int или подкласс int:
def mk_int(s):
s = s.strip()
return int(s) if s else 0
У меня есть синтаксическая система для текстовых записей фиксированной длины на основе таблицы макетов:
parse_table = [\
('name', type, length),
....
('numeric_field', int, 10), # int example
('textc_field', str, 100), # string example
...
]
Идея состоит в том, что, учитывая таблицу для типа сообщения, я просто просматриваю эту строку и восстанавливаю из нее словарь, в соответствии с записями в таблице.
Теперь я могу обрабатывать строки и собственные целые числа, но int()
не будет анализировать поля всех пространств (по уважительной причине, конечно).
Я хотел обработать его, указав подкласс int
, который обрабатывает пустые строки. Таким образом, я мог бы пойти и изменить тип соответствующих записей таблицы, не введя дополнительные kludges в код синтаксического анализа (например, фильтры), и он будет "просто работать".
Но я не могу понять, как переопределить конструктор встроенного типа в подтип, поскольку определение конструктора в подклассе, похоже, не помогает. Я чувствую, что мне не хватает чего-то фундаментального здесь о том, как работают встроенные типы Python.
Как мне подойти к этому? Я также открыт для альтернатив, которые не добавляют слишком много сложности.
Используйте функцию factory вместо int или подкласс int:
def mk_int(s):
s = s.strip()
return int(s) if s else 0
lenient_int = lambda string: int(string) if string.strip() else None
#else 0
#else ???
Вы можете использовать функцию int()
с аргументом s.strip() or 0
, i.e:
int(s.strip() or 0)
Если s.strip()
оценивается как ложное значение (как в случае с пустой строкой), тогда общее выражение s.strip() or 0
оценивается как 0
.
Или, если вы знаете, что строка всегда будет содержать только цифры или пустая, то просто:
int(s or 0)
обратите внимание, что 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/обрабатывать пустую строку как цифру/номер преобразовать нулевую строку как цифру/число/преобразовать нулевую строку как целое