# addmember.py
def addmember(memberlist, newmembers):
if type(newmembers) not in (type([]), type(())):
newmembers = [newmembers]
for m in newmembers:
if m not in memberlist:
memberlist.append(m)
return memberlist
我先将python文件放在上面,然后在IDLE
加载它 >>> members = ['a', 'b']
>>> import addmember
>>> addmember.addmember(members, 'c')
然后,错误提示如下:
if type(newmembers) not in (type([]), type(())): TypeError: type() takes 1 or 3 arguments
我无法理解错误的含义。
提前致谢~~:)
答案 0 :(得分:6)
看起来像你想要的
if not isinstance(newmembers, (list, tuple)):
请参阅isinstance()
。
type()
比较通常是检查对象兼容性的不好方法,因为它们忽略了继承。例如:
>>> from collections import defaultdict
>>> d = defaultdict()
>>> type(d) == dict
False
>>> isinstance(d, dict)
True
答案 1 :(得分:3)
解决此问题的最佳方法是根本不检查类型。
你想在这里检查的唯一原因是你可以迭代一个值,如果你没有得到一个列表或元组或其他你可以迭代的东西,对吧?那么为什么不尝试将其视为可迭代的,如果你不能这样做呢?
def addmember(memberlist, newmembers):
try:
iterator = iter(newmembers)
except TypeError:
iterator = [newmembers]
for m in iterator:
if m not in memberlist:
memberlist.append(m)
return memberlist
如果您做了很多这样的事情,可以将它包装在一个函数中:
def iterscalar(iterable_or_scalar):
try:
return iter(iterable_or_scalar)
except TypeError:
return [iterable_or_scalar]
现在你这样做:
def addmember(memberlist, newmembers):
for m in iterscalar(newmembers):
if m not in memberlist:
memberlist.append(m)
return memberlist
有时你想把字符串看作是标量,即使它们实际上是可迭代的。要做到这一点,你需要进行某种检查。
但最好检查“是一个可迭代的,而不是一个字符串”而不是“是一个列表或元组”,因为有更多类型的非字符串迭代,而不是字符串。
如果您想要比字符串检查更通用的内容,您通常要检查next(iter(newmembers))
与newmembers
的类型相同。
当然,您真正想要的取决于您的使用案例。
当然,如果您只使用了正确的数据类型,则根本不需要此代码。例如,如果memberlist
是set
而不是list
,则可以调用memberlist.update()
,它会添加任何尚未存在的成员并忽略那些是。 (如果你需要保留它们所在的顺序,请使用OrderedSet
文档中的简单collections
配方。)除了更简单之外,它还会快得多(因为您不需要继续搜索每个新成员的不断增长的列表)。
答案 2 :(得分:2)
不要使用type()
来检查对象的类型。使用isinstance()
:
if not isinstance(newmembers, (list, tuple)):
dostuff()
您的代码不应该重现该错误,您只将一个参数传递给type()