机器人框架运行关键字如果不更新代码的其余部分中的变量



我正在编辑一个自定义关键字的变量,我在满足条件时有条件运行。起初,我认为参数没有返回,因此我创建了一个全局关键字并在代码的这一部分内进行了修改,并且在返回主和登录该变量时,它仍然具有我声明的该全局变量的值。如果运行运行关键字时,是否有一个错误可以防止修改变量?

log

....
FOR  ${i}  IN RANGE  -1  -4  -1
     ${temp_names_cell} =  Get table cell  ${table_locator}  ${i}  1
     Loop columns  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
     log  ${WORKAROUND}
     Set to dictionary  ${test}  ${temp_names_cell}  ${WORKAROUND}  #${temp_values_cell}
log dictionary  ${test}
END
Loop columns
    [Arguments]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
    ${column_name} =  Set variable
    FOR  ${j}  IN RANGE  1  ${column_count}+1  1
        ${column_name} =  get table cell  ${table_locator}  1  ${j}
        ${column_name} =  Replace string  ${column_name}  n  ${SPACE}
        Run keyword if  "${column_name}" == "Short Term Backlog"   Get cell value  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
        log  ${temp_values_cell}
    END
    [Return]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}
    ${WORKAROUND} =  Get table cell  ${table_locator}  ${i}  ${j}
    [Return]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}

您正在描述两个单独的问题 - 它们不是两个问题,只有两种分享您遇到的状态的方法。

让我解决"全局"变量的用法- ${WORKAROUND},从关键字中传递信息(因为它更容易;)

您看到的行为是由于变量范围。考虑此伪代码:

a = 5
print(a)  # 5
def keyword():
    a = 10
    print(a)
keyword()  # 10
print(a)   # 5?

为什么最后一个print()输出5?
因为在范围内运行,这是变量的值。 keyword()中发生的事情是隔离的(默认情况下);您创建一个巧合的变量也称为" A",并为其分配一个值。在这一刻,您要阴影外部范围的变量" A" - 该程序仍然存在,但不再可以从keyword()内部到达。一旦keyword()完成,它的" A"就会消失,而全局则不变。
顺便说一句,此列表是Python的,语言机器人框架是基于的,并且其原理或多或少。

在您的代码中几乎发生了几乎相同的情况 - 变量${WORKAROUND}是在情况或关键字中定义的,并且您定义了一个新的,在 Get cell value中具有相同名称。因此,无论您在关键字中所做的一切都不会反映到外部范围中的原始字词。

值得庆幸的是,在机器人框架中有一个简单的解决方法(在机器人框架中) - 在关键字内使用Set Test Variable,从外部范围覆盖变量。${WORKAROUND}在此情况下的所有后续用法都将具有更改的值。还有类似的关键字Set Suite VariableSet Global Variable,将变量置于更高(和最高)的范围。


现在是第二种情况 - 将变量作为参数传递,并在〜方法〜关键字中更改它,希望它会在调用范围中更改。

我要写一些很长的东西,就像通过参考传递和姓名 ->对象绑定的价值与通过的第一部分一样无聊,但是 - 不,我会
a)在此处留在此处-https://jeffknupp.com/blog/2012/11/11/13/is-python-callbyvalue-or-callbyvalue-callbyreference-reference-neither/,这解释了该解释的范围比范围更好我会有,
b)直接达到这一点 - 这里的问题与本地变量的范围相同。

在此代码中:

Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}

,您声明您的关键字将采用一个参数,您将使用名称为" temp_values_cell"。
但是在下一行,您将该名称重新定为新值 - 内存中的一个新位置;对于您的关键字,现在只有变量" temp_values_cell",它是Get table cell的结果。现在,它与关键字调用中使用的原始变量没有任何共同点。
对于外界 - 什么都没有改变;您传递给关键字的原始变量不会受到影响,也不会更改。

和-Set Test Variable在这里无济于事(为什么 - 练习以后:)。

正统的方式是从关键字返回值,并使用它。您在示例代码中执行的操作 - 返回值,但不要分配。

最新更新