0

問題:ディレクトリにファイルのリストがあり、3 つの部分文字列条件すべてに一致する最初のファイルを取得したいと考えています。この例のケース 1 ソリューションに基づいて、基準に一致する最初のシーケンス項目を見つけるから、基準に一致する最初の項目を見つけました。

問題:ただし、ジェネレータ式で if-check の数を 3 つに拡張すると、python: Python/compile.c:3437: stackdepth_walk: Assertion `depth >= 0' failed. が発生することがわかりました。中止 (コアダンプ)

質問:これは私に特有のものです。いくつかの条件についてテストしているだけなので、スタック アサーションを引き起こすようなものではないようです。誰かがなぜこれが起こるのか説明できますか?

ケース 1 以下はエラーを再現します

ケース 2 は、このメソッドがまだ 2 つの if チェックで機能することを示しています。

ケース 3 は、リスト内包表記を分割して次の呼び出しを行うと、このメソッドが機能することを示しています。

ケース 4 は、同じチェックの代替ソリューションですが、正規表現として機能します。

#! /usr/bin/python
import re

files_in_dir = ['dp2_syouo_2013-05-16_0000.csv', 
                'dp1_torishima_2013-05-21_0000.csv', 
                'dp2_torishima_2013-05-22_0000.csv', 
                'dp1_hirokawa_2013-05-21_0000.csv', 
                'dp2_hirokawa_2013-05-22_0000.csv', 
                'dp2_syouo_2013-05-17_0000.csv', 
                'dp2_syouo_2013-05-18_0000.csv']

dp_string = "dp2"
date_string = "2013-05-22"
location_string = "torishima"

# case 1: Three filter checks, stackdepth_walk: Assertion
#python: Python/compile.c:3437: stackdepth_walk: Assertion `depth >= 0' failed.
# Abort (core dumped)
file_matched_1 = next( (file_in_dir for file_in_dir 
                        in files_in_dir 
                        if dp_string in file_in_dir                                             
                        if location_string in file_in_dir
                        if date_string in file_in_dir), None)
print "case 1: " + file_matched_1;


# case 2: Two filter checks, works fine
file_matched_2 = next( (file_in_dir for file_in_dir 
                        in files_in_dir 
                        if dp_string in file_in_dir                                             
                        if location_string in file_in_dir
                        ), None)
print "case 2: " + file_matched_2

# case 3: Generate the list first with three filters, then get the first item
files_matched_3 = [file_in_dir for file_in_dir 
                        in files_in_dir 
                        if dp_string in file_in_dir                                             
                        if location_string in file_in_dir
                        if date_string in file_in_dir]
file_matched_3 = next(iter(files_matched_3))
print "case 3: " + file_matched_3

# case 4: Put the three checks into a regex
date_location_regex = r'' + dp_string + '*.' + location_string + '*.' + date_string
file_matched_4 = next( (file_in_dir for file_in_dir 
                        in files_in_dir 
                        if re.search(date_location_regex, file_in_dir)), None)
print "case 4: " + file_matched_4
4

1 に答える 1