Robotframework Robot framework Run关键字,如果不更新代码其余部分中的变量?

Robotframework Robot framework Run关键字,如果不更新代码其余部分中的变量?,robotframework,Robotframework,我正在编辑自定义关键字中的变量,在满足条件时有条件地运行该关键字。起初,我认为没有返回参数,所以我创建了一个全局关键字,并在这部分代码中进行了修改,当返回到main并记录该变量时,它仍然具有我为该全局变量声明的值。 运行Run关键字If时是否存在阻止修改变量的错误 您描述的是两个独立的问题-它们不是两个问题,只是两种方法来共享您遇到问题的状态 让我来讨论一下“全局”变量--${WORKAROUND}的用法,以便在关键字中传递信息(因为它更容易;) 您看到的行为是由于变量的作用域。考虑这个伪代码

我正在编辑自定义关键字中的变量,在满足条件时有条件地运行该关键字。起初,我认为没有返回参数,所以我创建了一个全局关键字,并在这部分代码中进行了修改,当返回到main并记录该变量时,它仍然具有我为该全局变量声明的值。 运行Run关键字If时是否存在阻止修改变量的错误


您描述的是两个独立的问题-它们不是两个问题,只是两种方法来共享您遇到问题的状态

让我来讨论一下“全局”变量--
${WORKAROUND}
的用法,以便在关键字中传递信息(因为它更容易;)

您看到的行为是由于变量的作用域。考虑这个伪代码:

a = 5
print(a)  # 5

def keyword():
    a = 10
    print(a)

keyword()  # 10
print(a)   # 5?
那么,为什么最后一个
print()
输出5?
因为在它运行的范围内,这是变量的值。
keyword()
中发生的事情(默认情况下)与它隔离;您创建了一个同时也称为“a”的变量,并为其赋值。此时,您正在从外部作用域中隐藏变量“a”-它仍然存在于程序中,但不再可以从
关键字()
中访问它。一旦
keyword()
完成,其“a”将消失,而全局的则保持不变。
顺便说一句,这个清单是python语言,Robot框架是基于它的,它或多或少遵循一些原则

因此,在代码中也会发生类似的情况-变量
${WORKAROUND}
在case或关键字中定义,并且在
Get cell value
中定义了一个同名的新变量。因此,在关键字中对它所做的任何操作都不会反映到外部范围中的原始操作

谢天谢地,有一个简单的解决方法(在Robot框架中)——在关键字内部使用,从外部范围覆盖变量。在本例中,
${WORKAROUND}
的所有后续用法将具有更改的值。还有类似的关键字
Set-Suite-Variable
Set-Global-Variable
,它们将变量置于更高(和最高)的范围内


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

我本来打算写一些很长很无聊的东西,比如通过值传递与通过引用传递以及名称->对象绑定的第一部分,但是-不,我会
a) 把这个留在这里-,这解释了plus作用域比我的更好,并且
b) 直截了当地说——这里的问题与局部变量的作用域是一样的

在此代码中:

Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}
,您声明关键字将包含一个参数,您将使用名称“temp\u values\u cell”引用该参数。
但在下一行中,您将该名称重新绑定到一个新值—内存中的一个新位置;对于关键字,现在只有变量“temp\u values\u cell”保存
Get table cell
的结果。现在它与关键字调用中使用的原始变量没有任何共同之处。
对外部世界来说,一切都没有改变;传递给关键字的原始变量不受影响,也不会更改

并且-
设置测试变量
在这里没有帮助(为什么-后面的练习:)


传统的方法是从关键字返回一个值,然后使用它。您在示例代码中执行的操作-返回值,但不赋值。

谢谢您的回答。我将使用Set test variable关键字以备将来使用。问题是,当我使用与参数和返回参数相同的名称时,为什么不返回该关键字。其他变量(i,j)似乎没有问题地传递。我意识到我使用[Return]功能时出错了。我刚刚意识到我将参数视为通过引用传递,而实际上它们是作为副本传递的。有没有办法使用robot框架通过引用进行传递?请仔细阅读我在回答中看到的文章-在robot框架(或Python、Java或Javascript)中没有通过值或引用进行传递-传递的是标识内存区域的名称。如果您在关键字/方法中重新分配该名称-您没有影响原始内存,您正在处理一个新的内存。你的问题就是这样。另一方面,如果您对原始变量进行变异,则该变异将保持不变-将在关键字/方法结束后生效。因此,如果您的参数是列表、字典或类似对象-一个可变变量,您将该变量作为参数传递,并在关键字/方法内对其进行更改-而不是重新分配,但是更改其成员属性-对其进行变异,这将更改传递的参数本身。例如,如果调用
Append To List${my arg}abc
,并且传递了一个列表,那么在关键字完成后,该列表变量将有一个额外的成员-“abc”。
Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}