Python 如何知道变量是元组、字符串还是整数?

Python 如何知道变量是元组、字符串还是整数?,python,Python,在串联操作中将一个字符串添加到另一个字符串时,我试图找出类型不匹配 基本上返回的错误是a(不能连接字符串和元组);所以我想找出我在哪里把值赋值为元组而不是字符串 我分配的所有值都是字符串,所以我必须弄清楚元组是从哪里来的,所以我希望在Python中有一种方法可以找出变量中包含的内容和类型 到目前为止,我已经能够检查变量的内容,并且正确地得到我期望的值;但我也想知道变量的类型(从逻辑上讲,如果编译器能够引发类型错误,这意味着它知道变量内部的内容,以及它是否与要执行的操作兼容;因此必须有一种方法来获

在串联操作中将一个字符串添加到另一个字符串时,我试图找出类型不匹配

基本上返回的错误是a(不能连接字符串和元组);所以我想找出我在哪里把值赋值为元组而不是字符串

我分配的所有值都是字符串,所以我必须弄清楚元组是从哪里来的,所以我希望在Python中有一种方法可以找出变量中包含的内容和类型

到目前为止,我已经能够检查变量的内容,并且正确地得到我期望的值;但我也想知道变量的类型(从逻辑上讲,如果编译器能够引发类型错误,这意味着它知道变量内部的内容,以及它是否与要执行的操作兼容;因此必须有一种方法来获取该值/标记)

有没有办法在python中打印出变量的类型

顺便说一句,我试图将所有变量更改为显式字符串,但强制
str(myvar)
是不可行的,因此我不能在使用字符串的任何地方强制转换为字符串类型。

您只需使用:

type(varname)

哪个将输出int、str、float等。

使用iInstance

if isinstance(var, int):

if isinstance(var, str):

if isinstance(var, tuple):
您可能希望使用
isinstance(obj,basestring)
进行测试(假设Python 2.x)。您可以选择使用
isinstance
type
,并调用属性
\uuuu class\uuuuu
,但是
isinstance
可能就是您想要的。查看以更彻底地处理这三个选项之间的差异。

repr(object)将给出object的文本描述,其中应显示类型和值。您可以在调试器中打印或查看

isinstance(obj, tuple)
isinstance(obj, basestring)
isinstance(obj, int)
对于简单的值,repr通常返回与您在代码中逐字写入值相同的字符串。对于自定义类,它提供类名和对象id,或者如果类是

__repr__

被重写。

请注意,如果您想在if语句中检查您的var类型,构造
如果type(varname)=“tuple”:
将不起作用。但这些将:

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:

以补充的方式考虑这个混合整数和元组列表:

对于f填充:
打印(类型(f),f)
如果类型(f)==int:print“INTEGER!!!”
生成此输出:

(,0)
整数!!!
(, (62973, 39058, 25708, 102))
(, 1)
整数!!!
(, (16968, 12069, 3329, 102))
(, 2)
整数!!!
(, (24939, 62205, 30062, 102))
(, (32911, 32911, 0, 153))
(, (32911, 0, 0, 153))
(, (32911, 0, 32911, 153))
(, (65535, 0, 0, 153))
(, (0, 0, 65535, 153))
(, (0, 32911, 0, 153))
(, (0, 65535, 65535, 153))

因此,秘诀不是测试
“int”
字符串,而是测试
int
关键字。如果您像我一样从Bash脚本世界迁移,那么在Python脚本世界中使用
==
测试可能是您的第一步。

测试
str
将在
unicode
字符串上失败。另外,
isinstance(var,tuple)
将丢失碰巧是
list
s的任何变量,这在此类情况下经常出现。当然,如果var是
列表的一个实例,您可能会想出错,但最好确保您知道在不同的情况下会发生什么。在Python 3中,您可以使用一系列类型来测试:
isinstance(var,(tuple,list))
有趣的是,其他人得到了所有的投票,虽然您先回答了。但使用
\uuuu class\uuuu
几乎总是比使用
类型
好,因为在大多数情况下,它们会返回相同的内容,只是
类型
会将所有旧样式类的类型声明为“实例”。请参阅@DarrenYin
type(o)
o不是真的。类总是返回相同的内容。在链接的问题中,大多数上等投票的答案是这样的,但当你们链接它时,它并不存在。另外,
type
需要更少的键入,并且看起来像公共API函数(没有下划线)。不想挑剔,但变量在Python中从来没有类型,只有对象(由变量引用)有类型。因此,没有真正的类型转换,只有对象转换函数;我并不完全了解python在后台是如何工作的,但我假设它是一种面向对象的语言,所以当我创建一个变量时,它将创建一个正确数据类型的对象,并用指针引用它,所以当我使用变量时,我实际上使用的是对象字符串(或任何其他数据类型)的实例。你的最终目的是得到该对象的类型:)谢谢你的回复;这对于在运行程序时进行检查非常有用,但我在使用pdb进行调试时尝试获取值。这是避免问题的好方法!谢谢达伦;我可能会使用您的建议进行测试,但目前我正在使用pdb;因此,我可以找出哪一个是有问题的var,并避免犯同样的错误(我喜欢防御性编码,但同时我更喜欢避免在第一时间犯错误,而不是依靠检查来发现可能的错误)。有趣的是,还有class属性;从未听说过。谢谢你的回复,尤尔根。我尝试了repr,但它返回了变量的值*(在我的例子中是字符串),因此它与p(varname)的返回相同…我是否做错了什么,因为我应该看到如您所述的对象的类型、值和描述?否。它返回str或unicode的字符串文字,包括引号,因此您应该将其识别为该类型。对于整数类型,它返回无引号的数字;对于其他数字类型,它返回类似的数字。对于自定义类a,它在默认情况下返回类似的值,但某些类会覆盖此描述字符串。您应该真正使用isinstance。类型()在继承时是危险的