Python создает пустой объект произвольного типа?

для таких типов, как список, я могу легко создать пустой список, чтобы эта конструкция работала:

 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.


person agentp    schedule 11.06.2015    source источник
comment
iter тип, определенный пользователем, или v?   -  person Kevin    schedule 11.06.2015
comment
извините немного лаконично, см правки. Инициализация s значением 0 или None и т. Д. Приводит к ошибке «Ошибка неподдерживаемого типа операнда при + =».   -  person agentp    schedule 11.06.2015
comment
Итак, чтобы прояснить это: iter - это итерация объектов, отличных от обычных чисел, которые поддерживают сложение между собой?   -  person tobias_k    schedule 11.06.2015
comment
Точно, sum не работает с этим типом, хотя один обходной путь - написать свою собственную sum функцию, специфичную для этого типа (которая несколько более элегантна, чем приведенная выше)   -  person agentp    schedule 11.06.2015


Ответы (2)


есть ли способ создать пустой объект, чтобы оператор += вёл себя просто как обычное присваивание = независимо от типа на r.h.s?

Конечно. Просто напишите класс и определите свой __add__ метод для возврата RHS без изменений.

class DummyItem:
    def __add__(self, other):
        return other

s = DummyItem()
s += 23
print s

Результат:

23
person Kevin    schedule 11.06.2015

Предполагая, что в вашем списке есть хотя бы один элемент, вы можете просто создать итератор и использовать next для получения первого элемента, а они суммируют остальные:

i = iter(lst)
s = next(i)
for x in i:
    s += x

Вы также можете сделать это с помощью функции sum со вторым параметром указав начальное значение: s = sum(i, next(i)). Это явно не работает для строк, но вы также можете использовать reduce аналогичным образом, который будет работать со строками: s = reduce(operator.add, i, next(i)). Или вы даже можете объединить это с DummyItem из @ ответ Кевина, как s = sum(lst, DummyItem()). Таким образом, он также работает со строками, и вы можете использовать список напрямую и не нужно создавать итератор.

person tobias_k    schedule 11.06.2015
comment
явный цикл работает .. к сожалению sum выдает ошибку типа недопустимого аргумента .. - person agentp; 11.06.2015
comment
@agentp Похоже, sum явно не работает со строками. Могло ли это быть проблемой? - person tobias_k; 11.06.2015
comment
это тоже не строка, но та же проблема - я добавил в вопрос конкретику типа. - person agentp; 11.06.2015