Python 正在通过查找可能有问题的字符串浓缩代码\n

Python 正在通过查找可能有问题的字符串浓缩代码\n,python,parsing,abstract-syntax-tree,Python,Parsing,Abstract Syntax Tree,在Python中,字符串可以替换为换行符,因此我经常会遇到我想不起来的错误。例如: numbers = ( 'zero', 'one', 'two' 'three', 'four', 'five', ) # ok numbers = ( 'zero' 'one' 'two' 'three' 'four' 'five' ) # ok numbers = ( 'zero', 'one',

在Python中,字符串可以替换为换行符,因此我经常会遇到我想不起来的错误。例如:

numbers = (
    'zero',
    'one',
    'two'
    'three',
    'four',
    'five',
)
# ok
numbers = (
    'zero'
    'one'
    'two'
    'three'
    'four'
    'five'
)
# ok
numbers = (
    'zero',
    'one',
    'two',
    'three',
    'four',
    'five',
)

# error
numbers = (
    'zero',
    'one',
    'two',
    'three',
    'four',
    'five'
)
为了避免这个难题,我想在将源代码提交到存储库之前,先检查我想使用Git钩子提交的源代码是否有问题。但是,由于您可能真的想要组合字符串,我想强制源代码在每个字符串的末尾都有一个逗号,或者在每个字符串的末尾都没有逗号。例如:

numbers = (
    'zero',
    'one',
    'two'
    'three',
    'four',
    'five',
)
# ok
numbers = (
    'zero'
    'one'
    'two'
    'three'
    'four'
    'five'
)
# ok
numbers = (
    'zero',
    'one',
    'two',
    'three',
    'four',
    'five',
)

# error
numbers = (
    'zero',
    'one',
    'two',
    'three',
    'four',
    'five'
)
所以我检查了AST模块,看看AST模块是否能检测到它。因此:

>>> import ast
>>> ast.dump(ast.parse("('1'\n'2')"))
"Module(body=[Expr(value=Str(s='12'))])"

有好的解决办法吗

您使用的是元组,可能使用不同的结构(例如,方括号(列表)或有序集)将为您提供所需的内容。如果我正确地记住了元组/解除元组规则,那么您看到的是将6个元素的元组解压为1个元素变量的效果-python必须处理额外的5个值,并且concatation被选为标准行为

您不是第一个受到困扰的人。请看一看使用
标记化
的解决方案。可能的重复不是完全重复,因为该问题要求的是
'first''second'
,而不是
'first'\n'second'
,并且无法对函数调用和元组进行分类。很容易检查换行:只需比较标记的行号即可。dupe中的答案甚至显示了如何访问它们。的确,它没有区分不同的列表类型,但OP中没有这一要求,我认为这是不必要的,因为列表和函数调用(取决于函数)之间的语义差异通常很小。您使用的是元组,可能使用的是不同的结构(例如方括号(列表))或者一个有序的集合)会给你你想要的。您看到的是将6个元素的元组解压为1个元素变量的效果—python必须处理额外的5个值,并且concatation被选为标准行为。