2016-08-10 2 views
2

flake8 APIを使用してpep8モジュールを使用してPython構文を検証します。検証するために、無視されるコードを含む文字列が作成され、後でタプルに変換され、構文を検証する関数に渡されます。pep8を使用してpython構文を検証中に間違った出力を取得しました

ignore_code = """ 
     'E101','E111','E112','E113','E114','E115', 
     'E116','E121','E122','E123','E124','E125', 
     """.replace("\n",' ') 

if flake8.main.check_file(fileName,ignore=tuple(ignore_code),complexity=-1): 
    return False 
else: 
    return True 

は '\ n' はflake8.main.check_file機能のキーワードが

('E101','E111','E112','E113','E114','E115','E116','E121','E122','E123','E124','E125',) 

代わりにそれを取得、

無視することでタプルに複数行の文字列を変換する方法
("'", 'E', '1', '0', '1', "'", ',', "'", 'E', '1', '1', '1', "'", ',', "'", 'E', '1', '1', '2', "'", ',', "'", 'E', '1', '1', '3', "'", ',', "'", 'E', '1', '1', '4', "'") 

する必要があります無視します余分なスペース?

+3

引用符を省略して、 'ignore_code.split( '、')'を渡すのはなぜですか?最初に文字列で始めるのではなく、文字通り必要なタプルを作成するだけです**この問題は 'flake8'や構文のバリデーションにはまったく関係ありません。 – jonrsharpe

答えて

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' のキーワードを無視し、あなたは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) 

あなたはが本当にが必要な場合にする必要があります

'E122'、 'E123'、 'E124'、 'E125'、)その複数行の文字列から目的の結果を得るために、yoそれをフォーマットする必要があります。 .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'",ようになり

など、改行、スペース、タブ、として、文字列から先頭と末尾の空白文字を削除しますキャラクター。あなたが望むどのようにこれらを解釈するには、文字列 'E101'

最後に"'E101'"を評価するast.literal_evalを持つ文字列のリテラル評価を行うことができ、原因あなたの文字列の末尾,に(空の文字列をある項目があります)を削除する必要があります。したがって、条件式if item.split()が式に追加されます。

私たちは、英語では、私にその項目から構成されast.literal_eval(item.strip())itemがリストignore_code.split(",")からすべての項目でリストを与える」

ような何かを言ったかもしれない、ジェネレータ式 [ast.literal_eval(item.strip()) for item in ignore_code.split(",") if item.strip()]にこのアイデアを置きます item.strip()の値が空でない文字列である場合に限ります。

+0

**ありがとう!それは正常に動作しています。 –

関連する問題