在Python中测试变量类型

在Python中测试变量类型,python,testing,variables,Python,Testing,Variables,我正在为类“Room”创建一个初始化函数,发现程序不接受我对输入变量所做的测试 为什么会这样 def __init__(self, code, name, type, size, description, objects, exits): self.code = code self.name = name self.type = type self.size = size self.description = description self.ob

我正在为类“Room”创建一个初始化函数,发现程序不接受我对输入变量所做的测试

为什么会这样

def __init__(self, code, name, type, size, description, objects, exits):
    self.code = code
    self.name = name
    self.type = type
    self.size = size
    self.description = description
    self.objects = objects
    self.exits = exits
            #Check for input errors:
    if type(self.code) != type(str()):
        print 'Error found in module rooms.py!'
        print 'Error number: 110'
    elif type(self.name) != type(str()):
        print 'Error found in module rooms.py!'
        print 'Error number: 111'
    elif type(self.type) != type(str()):
        print 'Error found in module rooms.py!'
        print 'Error number: 112'
    elif type(self.size) != type(int()):
        print 'Error found in module rooms.py!'
        print 'Error number: 113'
    elif type(self.description) != type(str()):
        print 'Error found in module rooms.py!'
        print 'Error number: 114'
    elif type(self.objects) != type(list()):
        print 'Error found in module rooms.py!'
        print 'Error number: 115'
    elif type(self.exits) != type(tuple()):
        print 'Error found in module rooms.py!'
        print 'Error number: 116'
当我运行此命令时,会出现以下错误:

Traceback (most recent call last):
  File "/Users/Jasper/Development/Programming/MyProjects/Game Making Challenge/Europa   I/rooms.py", line 148, in <module>
    myRoom = Room(101, 'myRoom', 'Basic Room', 5, '<insert description>', myObjects, myExits)
  File "/Users/Jasper/Development/Programming/MyProjects/Game Making Challenge/Europa I/rooms.py", line 29, in __init__
    if type(self.code) != type(str()):
TypeError: 'str' object is not callable
回溯(最近一次呼叫最后一次):
文件“/Users/Jasper/Development/Programming/MyProjects/Game Making Challenge/Europa I/rooms.py”,第148行,在
myRoom=房间(101,‘myRoom’、‘基本房间’、‘5’、MyObject、MyExit)
文件“/Users/Jasper/Development/Programming/MyProjects/Game Making Challenge/Europa I/rooms.py”,第29行,init__
如果类型(自身代码)!=类型(str()):
TypeError:“str”对象不可调用
----谢谢你的帮助,但是:-----


这是否适用于isinstance(项,列表)或isinstance(项,元组)?

测试这样的类型不是一个好主意。但是,如果必须,请执行以下操作:

if isinstance(item, str):
   # do your thing
不回答“为什么”,但是

  • str
    本身已经是一个类型。您可以使用
    type(self.code)!=str
  • 但是更好的方法是使用
    isinstance(self.code,str)

  • Python是一种动态语言。显式地测试类型是个坏主意。事实上,您编写的代码本身应该是这样的:您永远不需要测试变量的类型

    如果您来自C/C++/Java,那么需要一些时间来克服它。

    两件事:

    • 您有一个名为“type”的传入参数。这掩盖了内置的“类型”,因为它是一个全局的,并且本地人胜过全局人。我假设发生这种异常是因为“type”有一个字符串值

    • 为什么要打印错误消息?报告错误的正确方法是引发异常


    总的来说,我同意其他答案,类型检查通常是一种python反模式。只有在极少数情况下才需要它。

    在您可能想要查看和查看之前,请将它放在所介绍的想法旁边

    从历史上看,在将可选类型集成到语言中的过程中一直存在着一些困难


    有一些特定的扩展语言,比如和,它们在一定程度上迫使您按顺序键入。很酷的一点是,这些语言允许您生成高性能的C扩展以与常规Python代码一起使用。

    通常不要进行类型检查,但如果这是参数的真正先决条件,则使用assert验证它们,而不是将错误打印到标准输出

    assert isinstance(code, str)
    assert isinstance(name, str)
    ...
    

    在python中,您只需使用变量,就好像它们在您想要的类型中一样。 如果出于某种原因,您有一个使用不同类型调用的函数,那么您可以将代码包装为try/catch

    def addOne(a):
        ''' 
        increments a with 1 if a is a number. 
        if a is a string, append '.' to it.    
        '''
        try:
            return a + 1
        except TypeError:
            return a + "."
    
    但你通常不想这么做。
    对于上述情况,请不要使用不同的功能。所有的类型检查都只是浪费时间。如果“不知何故”使用了错误的类型,您的程序将崩溃,并出现明显的错误。你不需要这个。请不要这样做。你自己调查答案有多难?要将示例减少到最低限度有多难?Jasper,由于elif,其余的检查无法访问。每次只有一个检查会失败,其他检查将在以后发现。+1:不要测试类型。如果他们错了,它就会崩溃。另一方面,它们可能是一种新类型,完全兼容,并且您已经阻止了一个完全兼容的用例。为了使S.Lott的观点具体化:如果不是因为过于热心的类型检查,发布的类可能可以与unicode字符串一起工作。一个“更好的方法”是不进行类型检查!不总是这样。有时候你必须输入check,比如在编码一个对象(比如JSON)时。你可以打印(self.code.dtype)来确定它的数据类型注意“真正的前提条件”在设计良好的代码中,这种情况并不像大多数进行类型检查的人所认为的那样经常发生。基于decorator的类型检查方法中的示例说明了为什么在Python中类型检查是徒劳的
    foo(“asdf”,2.5)
    已经在没有类型检查的情况下引发了
    TypeError
    ,并且
    foo(1,2)
    应该使用foo所做的,但由于类型检查的原因,没有使用,请注意Cython与Pyrex非常相似,但前者更愿意迅速发展,并为实用性做出牺牲。对于编写生产代码,Cython越实用,就越合适。(不过,我在这里看到的任何东西都没有真正表明这两种方法的用途。)