3

文字列のリストまたは1つだけをDBに追加したいとします。

names = ['Alice', 'Bob', 'Zoe']

そして私はそれadd_to_dbが両方のケースを受け入れることを望みます

add_to_db(names)
add_to_db('John')

これは正しい方法ですか:

def add_to_db(name_or_names):
    if (...):
        ... # add a single name
    else:
        for name in name_or_names:
            ... # add a single name
    commit_to_db()

文字列のリストであるか、単なる文字列であるかを条件として、最初に何を入力する必要が...ありますか(文字列も反復可能であることを忘れないでください)?

4

6 に答える 6

6

最善の策は、単一の文字列を1要素のリストにキャストしてから、残りの関数でリストのみを処理することだと思います。

def add_to_db(name_or_names):
    import types
    if isinstance(name_or_names, types.StringTypes):
        name_or_names = [name_or_names]
    try:
        for name in name_or_names:
            add_name(name)
        commit_to_db()
    except TypeError:
            # we didn't get a string OR a list >:(
于 2012-05-18T14:36:01.707 に答える
4

キーワード引数を使用します。

def add_to_db(name=None, names=None):
    if name:
        .....
    elif names:
        ....
    else:
        raise ValueError("Invalid arguments")

add_to_db(name='John')
add_to_db(names=['explicit', 'is', 'better'])
于 2012-05-18T14:27:55.033 に答える
1

オブジェクトが反復可能ではなく文字列であるかどうかをテストする方がおそらく簡単です。これは私が以前に使用したテクニックです。それがリストであることを確認してから、ループしてください。

def add_to_db(name_or_names):
    if isinstance(name_or_names, basestring):
        # str or unicode, convert to list
        name_or_names = [name_or_names]
    for name in name_or_names:
        add_name_to_db()
于 2012-05-18T14:36:30.340 に答える
1

次のようにインスタンスタイプを宣言できます。

from typing import List, Union

def my_fancy_func(l: Union[List [str], str]):
  if not isinstance(l, list):
    print("Error", type(sentence))
  else:
    print("Everything's okay")
于 2021-10-14T15:39:09.603 に答える
0

引数に__iter__属性があり、文字列が失敗するかどうかをテストできます。

if hasattr(arg, '__iter__'):
    print "I am an iterable that is not a string!"

この答えから。

于 2012-05-18T14:25:53.677 に答える
-2

パラメータのタイプを確認できます。

>>> type('John')
<type 'str'>
>>> type(['explicit', 'is', 'better'])
<type 'list'>
于 2012-05-18T14:36:09.173 に答える