how to know if a variable is a tuple, a string or an integer?
在串联操作中将一个字符串添加到另一个字符串时,我试图找出类型不匹配的地方。
基本上,返回的错误是一个TypeError(不能连接字符串和元组);所以我想知道我在哪里将值指定为tuple而不是string。
我分配的所有值都是字符串,所以我必须找出元组的来源,所以我希望在python中有一种方法来找出变量中包含什么以及它是什么类型的。
到目前为止,使用pdb,我能够检查变量的内容,并正确地得到我所期望的值;但我也希望知道变量的类型(从逻辑上讲,如果编译器能够引发类型错误,这意味着它知道变量中有什么,以及它是否与要执行的操作兼容;因此必须是获取该值/标志的一种方法)。
有没有办法在python中打印出变量的类型?
顺便说一句,我试图将所有变量都改为显式字符串,但是强制str (myvar)是不可行的,所以我不能在使用字符串的任何地方都转换为字符串类型。
- 不想挑剔,但在python中变量从来没有类型,只有对象(由变量引用)才有。因此,没有真正的类型转换,只有对象转换函数。
- 实际上,Jurgen;我并不完全了解python在引擎盖下的工作方式,但我假设这是一种面向对象的语言,所以当我创建一个变量时,它将创建一个正确数据类型的对象,并用指针引用它,所以当我使用该变量时,实际上我使用的是对象字符串(或其他数据类型)的一个实例。最后,你要得到对象的类型:)
1 2 3
| isinstance(obj, tuple)
isinstance(obj, basestring)
isinstance(obj, int) |
- 感谢您的回复;这对于在运行程序时进行检查非常好,但是在使用pdb进行调试时,我正在尝试获取该值。这是避免问题的好方法!
你只需要使用:
它将输出int、str、float等。
- 使用__class__几乎总是比使用type要好,因为在大多数情况下,它们返回相同的东西,除了type将所有旧样式类的类型声明为"实例"之外。参考这个问题
使用IsInstance?
1 2 3 4 5
| if isinstance(var, int):
if isinstance(var, str):
if isinstance(var, tuple): |
- 对str的测试将在unicode串上失败。此外,isinstance(var, tuple)会遗漏任何恰好是lists的变量,这些变量通常会出现在这种情况下。当然,如果var是list的一个实例,您可能会想出错,但最好确保您知道在不同情况下会发生什么。
- 在python3中,可以使用一系列类型进行测试:isinstance(var, (tuple, list))。
请注意,如果您想要检查if语句中的var类型,则构造if type(varname) =="tuple":不起作用。但这些将:
1 2 3 4 5
| if type(varname) is tuple:
if type(varname) is list:
if type(varname) is dict:
if type(varname) is int:
if type(varname) is str: |
- 你真的应该使用isInstance。类型()在继承方面很危险。
- @Bugmenot123,我没有涵盖所有可能的结果,我在记录人们在检查类型时通常会犯的错误,然后当它不起作用时会感到惊讶。否则,你绝对是对的。
您可能希望使用isinstance(obj, basestring)测试(假设使用python 2.x)。您可以选择使用isinstance、type,并调用属性__class__,但isinstance可能是您在这里想要的。请看这篇文章,以更彻底地处理这三个选项之间的差异。
- 多谢Darren,我可能会用你的建议来做测试,但现在我正在使用PDB,所以我可以找出哪一个是有问题的var,并避免犯同样的错误(我喜欢防御性编码,但同时我更喜欢在第一个实例中避免犯错误,而不是依靠检查来发现可能的错误。e)。有趣的是,还有类属性;从未听说过。
repr(object)将给出对象的文本描述,它应该显示类型和值。您可以在调试器中打印或查看此内容。
对于简单值,repr通常返回与用代码逐字写入值相同的字符串。对于自定义类,它提供类名和对象ID,如果类是
被重写。
- 感谢Jurgen的回复。我尝试了repr,但它返回了变量*的值,在我的例子中是字符串),所以它和p(varname)一样……我是否做了一些错误的事情,因为我应该像您提到的那样看到对象的类型、值和描述?
- 不。它返回str或unicode的字符串文字,包括引号,因此您应该将其识别为该类型。它返回整数类型的无引号数字和其他数字类型的相似数字。对于自定义类A,它默认返回类似于的值,但某些类会覆盖此描述字符串。
- 我明白了,真的很有用,非常感谢!!