我有一个函数,它获取一个序列作为参数,并根据该序列的类型创建一个该类型的新对象。
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])) # -> []