我有一个基于布局表的固定长度文本记录的解析系统:
parse_table = [\
('name', type, length),
....
('numeric_field', int, 10), # int example
('textc_field', str, 100), # string example
...
]
我的想法是,给定一个消息类型的表,我只需要查看字符串,然后根据表中的条目重新构建一个字典。
现在,我可以处理字符串和正确的整数,但是int()
不会解析所有空格字段(当然有充分的理由)。
我想通过定义处理空字符串的int
子类来处理它。这样我就可以改变适当的表条目的类型而不在解析代码中引入额外的kludges(比如过滤器),并且它“只是工作”。
但我无法弄清楚如何在子类型中覆盖内置类型的构造函数,因为子类中的定义构造函数似乎没有帮助。我觉得我在这里遗漏了一些关于Python内置类型如何工作的基本信息。
我该如何处理?我也愿意接受不会增加太多复杂性的替代方案。
答案 0 :(得分:33)
使用工厂函数而不是int或int的子类:
def mk_int(s):
s = s.strip()
return int(s) if s else 0
答案 1 :(得分:13)
将int()
函数与参数s.strip() or 0
一起使用,即:
int(s.strip() or 0)
或者,如果您知道该字符串将始终只包含数字字符或为空(""
),那么只需:
int(s or 0)
答案 2 :(得分:6)
lenient_int = lambda string: int(string) if string.strip() else None
#else 0
#else ???
答案 3 :(得分:0)
请注意,mylist是一个包含以下内容的列表:
元组和元组内部有 I)null / empty值, ii)数字,数字作为字符串 iii)空/空列表。例如:
mylist=[('','1',[]),('',[],2)]
@Arlaharen我在这里重复,你的解决方案,有点不同,为了添加关键字,因为,我失去了很多时间,为了找到它!
以下解决方案是将空字符串,空字符串或其他空字符串剥离/转换为零,但保留非空字符串,非空列表,包括数字/数字作为字符串,然后转换这些字符串,作为数字/数字。
简单的解决方案。注意" 0"可以由可迭代变量替换。 注意第一个解决方案不能处理元组内的空列表。
int(mylist[0][0]) if mylist[0][0].strip() else 0
我发现更简单的方法,IT可以处理元组中的空列表
int(mylist[0][0] or '0')
将字符串转换为数字/将字符串转换为数字/将字符串转换为整数 strip empty lists / strip empty string /将空字符串视为数字/数字 将null字符串转换为数字/数字/将空字符串转换为整数