如何使"int"解析空字符串?

Ale*_*x B 22 python

我有一个基于布局表的固定长度文本记录的解析系统:

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

我的想法是,给定一个消息类型的表,我只需要查看字符串,然后根据表中的条目重新构建一个字典.

现在,我可以处理字符串和正确的整数,但int()不会解析所有空格字段(当然有充分的理由).

我想通过定义int处理空字符串的子类来处理它.这样我就可以改变适当的表条目的类型而不在解析代码中引入额外的kludges(比如过滤器),并且它"只是工作".

但我无法弄清楚如何在子类型中覆盖内置类型的构造函数,因为子类中的定义构造函数似乎没有帮助.我觉得我在这里遗漏了一些关于Python内置类型如何工作的基本内容.

我该怎么做呢?我也愿意接受那些不会增加太多复杂性的替代方案.

Arl*_*ren 38

使用工厂函数而不是int或int的子类:

def mk_int(s):
    s = s.strip()
    return int(s) if s else 0
Run Code Online (Sandbox Code Playgroud)

  • @ DominicBou-Samra"a if b else c"是Python的三元运算符版本,在许多其他语言中看起来像"b?a:c".这里没有"回归后"的条件.在返回语句之前评估三元表达式*. (4认同)
  • 不知道你可以在返回后暴露条件。谢谢! (2认同)

eva*_*daz 21

使用int()带参数的函数s.strip() or 0,即:

int(s.strip() or 0)
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道字符串将始终只包含数字字符或为空(""),那么只需:

int(s or 0)
Run Code Online (Sandbox Code Playgroud)


bad*_*adp 6

lenient_int = lambda string: int(string) if string.strip() else None
                                                          #else 0
                                                          #else ???
Run Code Online (Sandbox Code Playgroud)