0

これを行うための標準ライブラリ関数またはよりPython的な方法はありますか?

def itemize(i):
    if type(i) is list:
        return i
    return [i]

コンテクスト:

単一の値からリストへのdb(nosqlスタイル)の移行に役立ちます

doc = <get doc from db>
for i in itemize(doc.var1):
    #blah

また

doc.var1 = itemize(doc.var1)
4

3 に答える 3

4

通常、この種のことを強制することは悪い考えです。多くの場合、あなたができる最もpythonicなことは、あなたのアイテムがシーケンスかどうかをチェックすることです:

import collections
def to_sequence(item):
    return item if isinstance(item,collections.Sequence) else [item]

これが渡したくないものを渡す1つの例は、文字列です...文字列はシーケンスであるため、to_sequence('foo')返さ'foo'れませんが、どちらか['foo']になりたいとは思われませ['f','o','o']ん...したがって、特別なケースが必要になる場合があります必要に応じてそのために。

そのための簡単な修正は次のとおりです(python2.xの場合):

import collections
def to_sequence(item):
    return item if isinstance(item,collections.Sequence) and hasattr(item,'__iter__') else [item]

しかし、繰り返しになりますが、通常、「pythonic」にすべきことは、この種のチェックを延期し、何らかのコンテキストでオブジェクトを使用しようとすることです。オブジェクトが失敗した場合は、反応するために何かを行うことができます。

于 2013-01-30T03:21:50.280 に答える
2
def itemize(i):
    try:
        return list(i) # Will return a list if provided an iterable
    except TypeError:
        return [i]

なぜこれが必要だと思うのか完全にはわかりませんが、実際に必要なのはどこか別の場所で問題になる可能性があります。

于 2013-01-30T03:19:04.673 に答える
2

チェックを入力する必要がある場合(Pythonでは一般的に避ける必要があります。ここで必要なコンテキストを確認したいと思います)、これを使用するこの省略形を使用することをお勧めしますisinstance

def makelist(i):
  return i if isinstance(i, list) else [i]
于 2013-01-30T03:19:29.520 に答える