Robot FW: Библиотека коллекций: «Копировать словарь»: Как сделать поверхностную копию составного словаря? - PullRequest
0 голосов
/ 31 января 2020

Рассмотрим следующий код:

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

Наблюдаемый результат enter image description here

Обратите внимание, что я использую версию 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}, который дал тот же наблюдаемый результат.

1 Ответ

1 голос
/ 31 января 2020

Проблема не в ключевом слове RF (очень редко они имеют расширенный UT), а в том, как вы его называете, а именно в следующем аргументе:

deepcopy=False

Возможно, вы думаете, что вы передавая логическое значение, но на самом деле вы передаете строку "False".
Внутри реализации ключевого слова есть это ветвление:

    if deepcopy:
        return copy.deepcopy(dictionary)

, а непустая строка оценивается как True, вы на самом деле получаете глубокую копию.

Это способ передачи реального False:

deepcopy=${False}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...