Zeep объекты, хранящиеся в списке, продолжают перезаписываться - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь добавить в список множество переменных, которые являются zeep объектами.Однако, когда я распечатываю список в конце, каждая переменная в списке содержит те же данные.

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

def create_json_list(json_template):
    newVar = json_template
    newVar['name'] = unique_name
    list.append(newVar)

    newVar = json_template
    newVar['name'] = unique_name2
    list.append(newVar)


    print(list[0]['name'])
    print(list[1]['name'])
# At this point, the same name gets printed twice

1 Ответ

0 голосов
/ 21 июня 2019

Вы добавляете один и тот же объект в список несколько раз.Если вы заметили, шаблон изменяется:

import json

template = {
    "field1": 1,
    "field2": "two"
}

json_list = list()

def create_json_list(json_template):
    newVar = json_template
    newVar['name'] = "unique_name"
    json_list.append(newVar)

    newVar = json_template
    newVar['name'] = 'another_unique_name'
    json_list.append(newVar)

    print(json.dumps(json_template, indent=4))

create_json_list(template)

Вывод

{
    "field2": "two", 
    "field1": 1, 
    "name": "another_unique_name"
}

Вам необходимо создать новый шаблон для каждой записи:

newVar = dict(json_template)

Из документации :

Assignment statements in Python do not copy objects, they create
bindings between a target and an object.

Если вы хотите скопировать объект, вам нужно сообщить об этом Python.В случае dict вы можете просто использовать конструктор, как показано выше.

Для объекта zeep вы должны иметь возможность использовать factory :

factory = client.type_factory('ns0')
newVar = factory.JsonTemplate({"field1": 1, "field2": "two"})
...