我有一个函数,该函数获取序列作为参数,并根据序列的类型创建该类型的新对象。
{{1}}
例如,如果'seq'是一个列表,则'new_object'将是一个空列表。 或者,如果“ seq”是一个字符串,那么“ new_object”将是一个空字符串,依此类推。
我该怎么做?
答案 0 :(得分:2)
这有效:
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
答案 1 :(得分:0)
您可以访问其__class__()
属性。
def empty(obj):
return obj.__class__()
print(empty(2)) # -> 0
print(empty([1,2,3])) # -> []
答案 2 :(得分:0)
由于对象是序列,因此可以使用切片来获取相同类型但为空的新对象:
def make_empty(obj):
return obj[:0]
make_empty(['a', 'b', 'c'])
输出:
[]