如何让“int”解析空字符串?

33 投票
4 回答
47178 浏览
提问于 2025-04-15 23:22

我有一个解析系统,用来处理固定长度的文本记录,具体是根据一个布局表来进行的:

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

这个系统的想法是,给定一个消息类型的表格,我只需要遍历字符串,然后根据表格里的内容重建一个字典。

现在,我可以处理字符串和正常的整数,但int()函数无法处理全是空格的字段(这当然是有原因的)。

我想通过定义一个int的子类来处理空字符串。这样,我就可以在不在解析代码中引入额外复杂处理的情况下,直接更改表格中相应条目的类型,让它“正常工作”。

但是,我搞不清楚如何在子类中重写内置类型的构造函数,因为在子类中定义构造函数似乎没有用。我觉得我在理解Python内置类型的工作原理上缺少了一些基本知识。

我应该怎么做呢?我也愿意考虑一些不太复杂的替代方案。

4 个回答

6

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会做出反应。

比如说,你可能想让程序在用户输入一个特定的数字时,显示一条消息。为了实现这个功能,我们可以使用“条件语句”。条件语句就像是一个判断,如果条件成立,程序就会执行某个动作;如果条件不成立,程序就会跳过这个动作。

在代码中,条件语句通常是用“if”这个词来开始的。接下来,我们会写出我们想要检查的条件,然后在条件成立时要执行的代码。这样,程序就能根据不同的情况做出不同的反应。

总之,条件语句帮助程序根据情况做出决策,就像人类在生活中根据不同的情况做出不同的选择一样。

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

使用 int() 函数,并传入参数 s.strip() or 0,也就是说:

int(s.strip() or 0)

或者如果你确定这个字符串里只会有数字字符或者是空的(""),那么你可以直接这样做:

int(s or 0)

在你的具体情况下,你可以使用 lambda 表达式,比如:

parse_table = [\
    ....
    ('numeric_field', lambda s: int(s.strip() or 0), 10), # int example
    ...
]
50

使用工厂函数来代替int或者int的子类:

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

撰写回答