TypeError:type()接受1或3个参数,Python

时间:2013-07-09 02:45:33

标签: python types

# 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

我无法理解错误的含义。

提前致谢~~:)

3 个答案:

答案 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的类型相同。

当然,您真正想要的取决于您的使用案例。


当然,如果您只使用了正确的数据类型,则根本不需要此代码。例如,如果memberlistset而不是list,则可以调用memberlist.update(),它会添加任何尚未存在的成员并忽略那些是。 (如果你需要保留它们所在的顺序,请使用OrderedSet文档中的简单collections配方。)除了更简单之外,它还会快得多(因为您不需要继续搜索每个新成员的不断增长的列表)。

答案 2 :(得分:2)

不要使用type()来检查对象的类型。使用isinstance()

if not isinstance(newmembers, (list, tuple)):
    dostuff()

您的代码不应该重现该错误,您只将一个参数传递给type()