3

假设我想向数据库添加一个字符串列表或一个字符串:

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 回答