【问题标题】:Robot FW : Collections library : "Copy Dictionary" : How to make a shallow copy of a compound dictionary?Robot FW : Collections library : "Copy Dictionary" : 如何制作复合字典的浅拷贝?
【发布时间】:2020-05-17 03:09:16
【问题描述】:

考虑以下代码:

在 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'}}

在 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?

目标在测试用例中表述为:

如果我们通过 shallow_copy 修改包含的对象(即 deep_dict), 原来的 Compound_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 上)

Acc.to the documentation about Copy Dictionary:

deepcopy 参数控制返回的字典是否应该是 浅拷贝或深拷贝。默认情况下返回一个浅拷贝,但这可以是 通过给 deepcopy 一个真值来改变(参见布尔参数)。这 > 是 Robot Framework 3.1.2 中的一个新选项。早期版本总是 返回浅拷贝。

Acc.to the documentation about Boolean Arguments:

一些关键字接受作为布尔值 true 或 false 处理的参数。如果这样的参数以字符串形式给出,则如果它是空字符串或等于 FALSE、NONE、NO、OFF 或 0,则视为 false,不区分大小写。其他字符串无论其值如何都被视为真。

另请注意,我也尝试了deepcopy=${False},产生了相同的观察结果。

【问题讨论】:

    标签: robotframework


    【解决方案1】:

    问题不在于 RF 关键字(很少有,他们有广泛的 UT),而在于您调用它的方式,即这个论点:

    deepcopy=False
    

    您可能认为您传递的是布尔值,但实际上您传递的是字符串"False"
    在关键字的实现内部有这个分支:

        if deepcopy:
            return copy.deepcopy(dictionary)
    

    ,当一个非空字符串计算为True时,你实际上得到了一个深拷贝。

    这是传递真实False的方法:

    deepcopy=${False}
    

    【讨论】:

    • 我根据您的评论说明更新了票证。长话短说, deepcopy=${False} 也不起作用。可以在您的机器上运行此代码吗?谢谢托多。
    • “一些关键字接受作为布尔值处理的参数......” - 这个没有,检查它的实现。 github.com/robotframework/robotframework/blob/master/src/robot/…我不能很快运行你的代码,但如果它与正确的布尔值 false 行为不端,我会感到非常惊讶。
    • 我承认您提供的代码链接确实与关键字文档所说的不同。因此,一个问题是代码与其文档之间的冲突。另一个问题是,鉴于您提供的代码, deepcopy=${False} 不起作用(我删除了所有测试日志并重新运行测试用例两次)。是什么原因??
    • 离题,但我看不出关键字的文档与其实现有何不同;它准确地描述了关键字的作用。
    • 关键字的文档说 deepcopy=False 或 deepcopy=${False} 将被视为虚假值,因此会发生浅拷贝。请注意,我使用关键字文档更新了这张票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多