假设我想在数据库中添加字符串列表或只添加一个字符串:
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()
我应该在第一个...
中放入什么,作为一个字符串列表还是一个字符串的条件(不要忘记该字符串也是可迭代的)?
答案 0 :(得分:5)
我认为最好的办法是将单个字符串转换为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 >:(
答案 1 :(得分:3)
使用关键字参数:
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'])
答案 2 :(得分: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()
答案 3 :(得分:0)
您可以测试参数是否具有__iter__
属性,对于哪个字符串将失败:
if hasattr(arg, '__iter__'):
print "I am an iterable that is not a string!"
来自this answer。
答案 4 :(得分:-2)
您可以检查参数的类型:
>>> type('John')
<type 'str'>
>>> type(['explicit', 'is', 'better'])
<type 'list'>