Рассмотрим следующий код:
In Utils.py:
@keyword
def get_compound_dictionary():
"""
https://docs.python.org/3/library/copy.html
An example compound dictionary
"""
return {'key1': 'value1', 'deep_dict': {'key2': 'value2'}}
In collection-library-tests.robot
*** Settings ***
Documentation A test suite utilizing all collection library keywords
Library Collections
Library Utils.py
# To run:
# robot --pythonpath Resources --noncritical failure-expected -d Results/ Tests/collection-
library-tests.robot
*** Test Cases ***
Use "Copy Dictionary" : Shallow Copy
${compound_python_dictionary} = get compound dictionary
&{shallow_copy} = Copy Dictionary ${compound_python_dictionary} deepcopy=False
# if we modify the contained objects (i.e. deep_dict) through the shallow_copy,
# the original compound_python_dictionary will see the changes in the contained objects
Set To Dictionary ${shallow_copy}[deep_dict] key2=modified
Log ${shallow_copy}
Log ${compound_python_dictionary}
Should Be Equal ${compound_python_dictionary}[deep_dict][key2] modified # fails, why?
Цель указана в тестовом примере как:
, если мы изменим содержащиеся объекты (то есть deep_dict) через shallow_copy, исходный соединение component_python_dictionary будет просмотреть изменения в содержащихся объектах
Ожидаемый результат
Should Be Equal ${compound_python_dictionary}[deep_dict][key2] modified # passes
Наблюдаемый результат
Обратите внимание, что я использую версию Robot FW: Robot Framework 3.1.2 (Python 3.7.4 на linux)
A cc .to документация по Копировать словарь :
Аргумент deepcopy контролирует, должен ли возвращаемый словарь быть неглубокой или глубокой копией. По умолчанию возвращает мелкую копию, но это можно изменить, задав для глубокого копирования истинное значение (см. логические аргументы ). Это> новая опция в Robot Framework 3.1.2. Более ранние версии всегда возвращали мелкие копии.
A cc .to документация о логических аргументах :
Некоторые ключевые слова принимают аргументы, которые обрабатываются в качестве логических значений true или false. Если такой аргумент задан в виде строки, он считается ложным, если он является пустой строкой или равен FALSE, NONE, NO, OFF или 0, без учета регистра. Другие строки считаются истинными независимо от их значения.
Обратите внимание, что я также попробовал deepcopy=${False}
, который дал тот же наблюдаемый результат.