我想使用flake8 API使用pep8模块验证python语法。为了验证,创建了一个字符串,其中包含要被忽略的代码,稍后将转换为元组,同时传递给函数以验证语法。
('E101','E111','E112','E113','E114','E115','E116','E121','E122','E123','E124','E125',)
忽略flake8.main.check_file函数的关键字
("'", 'E', '1', '0', '1', "'", ',', "'", 'E', '1', '1', '1', "'", ',', "'", 'E', '1', '1', '2', "'", ',', "'", 'E', '1', '1', '3', "'", ',', "'", 'E', '1', '1', '4', "'")
取而代之的是,
{{1}}
如何通过忽略'\ n'和额外空格将多行字符串转换为元组?
答案 0 :(得分:2)
您的问题是当您tuple(ignore_code)
执行您传入的内容时。
>>> tuple(ignore_code)
(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', "'", 'E', '1', '0', '1', "'", ',', "'", 'E', '1', '1', '1', "'", ',', "'", 'E', '1', '1', '2', "'", ',', "'", 'E', '1', '1', '3', "'", ',', "'", 'E', '1', '1', '4', "'", ',', "'", 'E', '1', '1', '5', "'", ',', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', "'", 'E', '1', '1', '6', "'", ',', "'", 'E', '1', '2', '1', "'", ',', "'", 'E', '1', '2', '2', "'", ',', "'", 'E', '1', '2', '3', "'", ',', "'", 'E', '1', '2', '4', "'", ',', "'", 'E', '1', '2', '5', "'", ',', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ')
你基本上已经说过你需要做什么了。
忽略flake8.main.check_file函数的关键字应该是(' E101',' E111',' E112',' E113' ' E114'' E115'' E116'' E121'' E122',' E123'' E124'' E125',)
你应该使ignore_code
想要传递的迭代,IE
ignore_code = ('E101','E111','E112','E113','E114','E115','E116','E121','E122','E123','E124','E125')
flake8.main.check_file(fileName, ignore=ignore_code, complexity=-1)
如果 确实 希望从该多行字符串中获得所需的结果,则需要对其进行格式化。执行.replace("\n", " ")
不会削减它,因为有更多的空白字符而不仅仅是新行字符,并且您已将内部项目括在引号中。此外,tuple(some_iterable)
以可迭代的方式生成项目的元组。字符串是其字符的可迭代字符,但您需要一个可迭代的项,其字符串为'E101'
而不是字符。
我能够通过以下方式获得您正在寻找的元组。
import ast
the_tuple = tuple([ast.literal_eval(item.strip()) for item in ignore_code.split(",") if item.strip()])
#the_tuple
#('E101', 'E111', 'E112', 'E113', 'E114', 'E115', 'E116', 'E121', 'E122', 'E123', 'E124', 'E125')
详细说明该代码及其如何格式化多行字符串:
ignore_code.split(",")
会将字符串拆分为一个列表,其列表由该字符串中由,
字符分隔(但不包括)的部分组成。 IE ["\n 'E101'", "'E111'",#etc]
这会让你到目前为止,但这些项目仍有空白。 item.strip()
将从字符串中删除前导和尾随空白字符,例如换行符,空格,制表符等。
现在你几乎就在那里,但这些项目看起来像"'E101'", "'E111'",
- 它们是包含文字'
字符的字符串。要解释这些您想要的方式,您可以使用ast.literal_eval
对字符串进行字面评估,该评估会将"'E101'"
评估为字符串'E101'
最后,有一个空字符串项(由于字符串中的尾随,
),需要将其删除。因此条件if item.split()
被添加到表达式中。
我们把这个想法放到一个生成器表达式[ast.literal_eval(item.strip()) for item in ignore_code.split(",") if item.strip()]
中,在英语中可能会说像
"给我一个列表,其项目由
ast.literal_eval(item.strip())
组成,其中item
是列表ignore_code.split(",")
中的每个项目,但仅限item.strip()
的值是一个非空字符串。"