python 创建任意类型的空对象?
python create empty object of arbitrary type?
对于像列表这样的类型,我可以很容易地创建一个空列表来使这个构造起作用:
s = []
s+= [1,2,3] # result s assigned [1,2,3]
在这样的构造中显然很有用:
s=[]
for v in (list1,list2,list3..):
if condition : s+=v
现在我正在使用一个用户定义的类型,它在一个模块中定义,我无法读取或更改。我必须这样做:
s=0
for v in (typefoo1,typefoo2,..):
if condition :
if s==0 :
s=v
else:
s+=v
这行得通,但是很丑,而且经常出现,这很烦人。
所以..有没有办法创建一个空对象,使得 +=
运算符的行为就像常规赋值 =
而不管 r.h.s 上的类型?
编辑:
我试图故意让问题保持通用,但为了完整性,所讨论的类型是 Abaqus 几何序列。
is there a way to create an empty object such that the +=
operator would behave simply like a regular assignment =
regardless of the type on the r.h.s?
当然可以。只需编写 class 并将 __add__
方法定义为 return RHS 未修改。
class DummyItem:
def __add__(self, other):
return other
s = DummyItem()
s += 23
print s
结果:
23
假设您的列表至少有一个元素,您可以只创建一个迭代器并使用 next
获取第一个元素并将其余元素相加:
i = iter(lst)
s = next(i)
for x in i:
s += x
您也可以使用 sum
function, with a second paramter specifying the initial value: s = sum(i, next(i))
. This explicitly does not work for strings, but you could also use reduce
in a similar way, which will work with strings: s = reduce(operator.add, i, next(i))
. Or, you could even combine this with the DummyItem
from 作为 s = sum(lst, DummyItem())
来执行此操作。这样它也适用于字符串,你可以直接使用列表而不需要创建迭代器。
对于像列表这样的类型,我可以很容易地创建一个空列表来使这个构造起作用:
s = []
s+= [1,2,3] # result s assigned [1,2,3]
在这样的构造中显然很有用:
s=[]
for v in (list1,list2,list3..):
if condition : s+=v
现在我正在使用一个用户定义的类型,它在一个模块中定义,我无法读取或更改。我必须这样做:
s=0
for v in (typefoo1,typefoo2,..):
if condition :
if s==0 :
s=v
else:
s+=v
这行得通,但是很丑,而且经常出现,这很烦人。
所以..有没有办法创建一个空对象,使得 +=
运算符的行为就像常规赋值 =
而不管 r.h.s 上的类型?
编辑: 我试图故意让问题保持通用,但为了完整性,所讨论的类型是 Abaqus 几何序列。
is there a way to create an empty object such that the
+=
operator would behave simply like a regular assignment=
regardless of the type on the r.h.s?
当然可以。只需编写 class 并将 __add__
方法定义为 return RHS 未修改。
class DummyItem:
def __add__(self, other):
return other
s = DummyItem()
s += 23
print s
结果:
23
假设您的列表至少有一个元素,您可以只创建一个迭代器并使用 next
获取第一个元素并将其余元素相加:
i = iter(lst)
s = next(i)
for x in i:
s += x
您也可以使用 sum
function, with a second paramter specifying the initial value: s = sum(i, next(i))
. This explicitly does not work for strings, but you could also use reduce
in a similar way, which will work with strings: s = reduce(operator.add, i, next(i))
. Or, you could even combine this with the DummyItem
from s = sum(lst, DummyItem())
来执行此操作。这样它也适用于字符串,你可以直接使用列表而不需要创建迭代器。