2016-08-25 2 views
0

私はシステムの複雑なバックエンドを持っていますが、私が話していることを知るための簡単な例を作ろうとしました。リストの要素をチェックし、リストの終わりに(エラーなしで)停止するためのpyononicな方法はありますか?

私は基本的に私はIDのリストを持っています、ユーザーは(GUIを介して)IDを生成するこのリストを繰り返します。

ある時点で、彼らは混乱したりスキップされたものをすべて修正したい(これらはすべて同じIDを持つ)。これは私が問題を抱えているところです。

私はまさにそのこと(悪いIDのリストをチェックする)を書いたことがありますが、問題はリストの終わりに達するとインデックスエラーをスローします。私はきれいにwhileループ、およびその代わり

def nextID(): 
    ''' 
     increment counter until we find a junk ID 
    ''' 
    global tindx 

    skips = 0 
    while IDs[tindx] != 'junk_id' and tindx != len(IDs): 
     print 'This ID is good: %s' %IDs[tindx] 
     skips+=1 
     tindx+=1  
    print 'Skipped %i IDs' %(skips), 'tindx is now',tindx 

これは設計されて機能(再び巨大な簡素化)

tindx = 0 

IDs = ['abc','bcd','cde','junk_id','junk_id','def','efg','junk_id','fgh','ghi'] 

# This is all hadled with in an interactive GUI 
# User wants next ID 
nextID() 
# User changes ID 
IDs[tindx] = 'good_id!' 
# User wants next ID 
nextID() 
# User changes ID 
IDs[tindx] = 'another_good_id' 
# etc .... 

は私が切り替えるとことを知って、次のように使用することを終了しますwhileループ条件の順序では、自動IndexErrorは避けられますが、ユーザーはリストの最後にヒットしたことを知らず、IDを変更しようとします(同じエラーが発生します)。

完了したらユーザーにsave_IDs()関数を実行し、プログラムを終了するように伝えたいと思います。ソフトウェアの再設計のこの側面は、以下のifの条件を追加するより良い方法はあり

while ... 

    if tindx == len(IDs): 
     print 'you\'re done' 
     save_IDs() 
     return None 

答えて

1

あなたが述べたように、しばらくの間で議論を切り替える必要があります。そうしないと

while tindx != len(IDs) and IDs[tindx] != 'junk_id': 
    ... 

それを最初にID [tindx]にアクセスし、それが無効であるかどうかをチェックします。

それが最後に到達したときに問題のために、あなたは新しいインデックスまたはNoneを返すNEXTIDかもしれないが:

def nextID(last_offset): 
    offset = last_offset 

    while offset < len(IDs) and IDs[offset] != 'junk_id' 
     offset += 1 

    if offset >= len(IDs): 
     return None 

    if offset > last_offset: 
     print("Skipped %d IDs" % (offset - last_offset)) 

    return offset 

そして、それを使用する:

current_offset = 0 
while doing things: 
    current_offset = nextID(current_offset) 
    if current_offset == None: 
     # All done. 
     break 

    print("New offset: %d" % (offset)) 

    if user changes id: 
     IDs[current_offset] = 'good_id!' 
    else: 
     # If the user didn't change the ID for whatever reason, 
     # you'll need to manually increment current_offset. 
     current_offset += 1 

print("All done, saving..") 
saveIDs() 

あなたは内部のコールバックにいる場合GUIの場合は、次のようなものがあります。

理想的には、それが何をすべきかをする必要があるので、

元のコードでは、nextID()は「次のIDを見つける」だけでなく、プロセス全体の状態を変更していました。

これは、nextID()が次のIDを見つけて返すことを期待しているかもしれない開発者の観点からかなり誤解を招きます。

+0

私のnextIDの定義についてお話いただきありがとうございます。これは、主に自己学習のために私が遭遇する共通の問題です。 あなたが与えてくれた例はずっとよく読んでいます。代わりに、これをエミュレートするために使用した関数を再構成すると思います。それは仕事のビットですが、私はおそらく後で自分自身に感謝するでしょう。これを実証してくれてありがとう。 – FriskyGrub

関連する問題