根据python中给定对象的类型创建一个新对象



我有一个函数,它获取一个序列作为参数,并根据该序列的类型创建一个该类型的新对象。

def myFunc(seq):
new_object = # don't know how to instantiate it based on seq type.

例如,如果"seq"是一个列表,那么"new_object"将是一个空列表。或者,如果"seq"是字符串,则"new_object"将是空字符串,依此类推

我该怎么做??

这是有效的:

def make_empty(obj):
return type(obj)()
>>> make_empty([1, 2, 3])
[]
>>> make_empty('abc')
''

不仅适用于数字序列:

>>> make_empty(2)
0

或字典:

>>> make_empty({'a': 100})
{}

使用type获取对象的类型,并使用()创建对象的新的空实例。

允许指定允许类型的版本:

def make_empty(obj, allowed_types=None):
if allowed_types is None:
return type(obj)()
for typ in allowed_types:
if isinstance(obj, typ):
return type(obj)()
raise TypeError(f'Type {type(obj)} not allowed')

现在。

它仍然工作非序列:

>>> make_empty(3)
0

但是可以指定允许的类型:

>>> make_empty(3, allowed_types=(str, list, tuple))
...
TypeError: Type <class 'int'> not allowed

如果允许,序列可以工作:

>>> make_empty('abc', allowed_types=(str, list, tuple))
''
>>> make_empty([1, 2, 3], allowed_types=(str, list, tuple))
[]
>>> make_empty((1, 2, 3), allowed_types=(str, list, tuple))
()

如果不允许,字典就不会

>>> make_empty({'a': 100}, allowed_types=(str, list, tuple))
...
TypeError: Type <class 'dict'> not allowed 

由于对象是一个序列,因此可以使用切片来获得相同类型但为空的新对象:

def make_empty(obj):
return obj[:0]
make_empty(['a', 'b', 'c'])

输出:

[]

您可以访问其__class__()属性。

def empty(obj):
return obj.__class__()
print(empty(2))  # -> 0
print(empty([1,2,3]))  # -> []

最新更新