次の形式のタプルを解析しようとしています。
a=(1,2)
また
b=((1,2), (3,4)...)
a の場合、コードは次のようになります。
x, y = a
b は次のようになります。
for element in b:
x, y = element
両方のフォームを受け入れるための迅速でクリーンな方法はありますか? これは MIDI 受信コールバックにあります (x は実行する関数へのポインタで、y はライトに渡される強度データです)。
# If your input is in in_seq...
if hasattr(in_seq[0], "__iter__"):
# b case
else:
# a case
これは基本的に、入力シーケンスの最初の要素が反復可能かどうかを確認します。そうであれば、それはあなたの2番目のケースです(タプルは反復可能であるため)、そうでなければ、それはあなたの最初のケースです。
入力がタプルになることが確実にわかっている場合は、代わりにこれを使用できます。
if isinstance(in_seq[0], tuple):
# b case
else:
# a case
やりたいことに応じて、「a」ケースの処理は、単一のタプルをより大きなタプル内にバンドルし、「b」ケースと同じコードを呼び出すのと同じくらい簡単になる可能性があります。
b_case = (a_case,)
編集:コメントで指摘されているように、より良いバージョンは...
from collections import Iterable
if isinstance(in_seq[0], Iterable):
# ...
それを行う正しい方法は次のとおりです。
a = ((1,2),) # note the difference
b = ((1,2), (3,4), ...)
for pointer, intensity in a:
pass # here you do what you want