检查给定对象是否属于给定类型的最佳方法是什么?如何检查对象是否继承给定类型?
假设我有一个对象o.我如何检查它是否是一个str?
如何检查Python对象是否为字符串(常规或Unicode)?
我知道我可以使用:isinstance(x, str)在python-3.x中但是我需要检查python-2.x中是否有某个字符串.将isinstance(x, str)在python-2.x中按预期工作?或者我需要检查版本并使用isinstance(x, basestr)?
具体来说,在python-2.x中:
>>>isinstance(u"test", str)
False
Run Code Online (Sandbox Code Playgroud)
和python-3.x没有 u"foo"
a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
Run Code Online (Sandbox Code Playgroud) 我有这样的功能
def print_stuff(items):
if isinstance(items, (str, bytes)):
items = (items,)
for item in items:
print (item)
Run Code Online (Sandbox Code Playgroud)
可以这样称呼:
In [37]: print_stuff(('a', 'b'))
a
b
In [38]: print_stuff('a')
a
Run Code Online (Sandbox Code Playgroud)
我不喜欢做,isinstance (items, (str, bytes))我更愿意做isinstance(item, (collections.abc.MAGIC))
其中MAGIC是所有序列对象的ABC,可以包含其他序列对象,例如
但不是:
恐怕这是不可能的,tuple并且str具有相同的7个ABC :(
In [49]: [v for k, v in vars(collections.abc).items()
...: if inspect.isclass(v) and issubclass(tuple, v) ]
Out[49]:
[collections.abc.Hashable,
collections.abc.Iterable,
collections.abc.Reversible,
collections.abc.Sized,
collections.abc.Container,
collections.abc.Collection,
collections.abc.Sequence]
In [50]: [v for k, v in …Run Code Online (Sandbox Code Playgroud) 我正在使用python 2.7,但是试图创建一个代码来检查对象是否是与python 3+兼容的basetring的子类.我试图遵循这里建议的方法,并在过程中发现了一个我不理解的行为
如果我做:
def foo():
try: basestring
except NameError:
print "a"
foo()
Run Code Online (Sandbox Code Playgroud)
什么都没发生.
如果我稍微修改那个代码只是在except:
def foo():
try: basestring
except NameError:
print "a"
basestring=str
foo()
Run Code Online (Sandbox Code Playgroud)
然后打印"a".
我不明白如何向except块添加内容,可以影响异常的触发.
我在函数外检查了相同的代码:
try:
basestring
except NameError:
print("a")
basestring=str
Run Code Online (Sandbox Code Playgroud)
但在这种情况下没有打印出来.
我正在读一本关于Python的书,它说当你调用help(obj)列出所有可以调用obj的方法时,__双方包围的方法都是无法调用的私有辅助方法.
但是,列出的字符串方法之一是__len__,您可以验证if是否s为某个字符串,进入s.__len__()Python返回的长度为s.
为什么可以调用其中的一些方法,例如__len__,但其他方法无法调用?
基本上,我需要检查变量存储的数据类型,然后用新数据替换变量中存储的数据.例如,如何检查变量是存储字符串数据还是整数数据?
源代码:
class Toy:
#Toy Class Constructor
def __init__(self):
Name = "Train Engine";
ID = "TE11";
Price = 0.99;
Minimum_Age = 4;
#Return Name
def Return_Name(self):
print(Name)
return Name
#Set Name
def Set_Name(self, Variable):
#This is where I would need to check the type of data that the variable 'Variable' is currently storing.
Name = Variable
#Return ID
def Return_ID(self):
print(ID)
return ID
#Set ID
def Set_ID(self, Variable):
#This is where I would need to check the type of data …Run Code Online (Sandbox Code Playgroud)