我正在用自定义关键字编辑一个变量,该变量在满足条件时有条件地运行。起初我以为没有返回参数,所以我创建了一个全局关键字并在代码的这一部分进行了修改,当返回main并记录该变量时,它仍然具有我为该全局变量声明的值。 是否有一个错误可以阻止在运行Run Key If时修改变量?
....
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}
答案 0 :(得分:1)
您要描述两个独立的问题-它们不是2个问题,而只是两种共享遇到问题的状态的方法。
让我来解决“全局”变量-${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”消失,而全局的a不变。
顺便说一下,该清单是python,它是Robot Framework语言的基础,并且它所遵循的原理也差不多。
代码中发生的情况几乎相同-变量${WORKAROUND}
是在大小写或关键字中定义的,而您在{{1内定义了具有相同名称的新变量 }}。因此,您对关键字所做的任何操作都不会反映到外部作用域中的原始内容。
很幸运,有一个简单的解决方法(在Robot Framework中)-在关键字内部使用Set Test Variable
,以覆盖外部作用域中的变量。在此情况下,Get cell value
的所有后续用法将具有更改的值。还有类似的关键字${WORKAROUND}
和Set Suite Variable
,它们将变量置于更高(和最高)的范围内。
现在,第二种情况-将变量作为参数传递,并在〜method〜关键字中进行更改,希望在调用范围内将其更改。
我打算写很长的东西,就像第一部分那样无聊,用于传递值与按引用传递,以及名称->对象绑定,但是-不,我会
a)留在这里-https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/,它解释说加范围比我本来要好,并且
b)直截了当-这里的问题与局部变量的作用域相同。
在此代码中:
Set Global Variable
,您声明关键字将带有一个参数,并将使用名称“ temp_values_cell”进行引用。
但是在接下来的一行中,您将该名称重新绑定到一个新值-内存中的新位置;对于您的关键字,现在只有变量“ temp_values_cell”保存了Get cell value
[Arguments] ${temp_values_cell} ${table_locator} ${i} ${j}
${temp_values_cell} = Get table cell ${table_locator} ${i} ${j}
的结果。现在,它与关键字调用中使用的原始变量没有任何共同之处。
对于外部世界-一切都没有改变;您传递给关键字的原始变量不会受到影响,也不会更改。
而且-Get table cell
在这里无济于事(为什么-稍后再做:)。
正统的方法是从关键字返回值并使用它。在示例代码中执行的操作-返回值,但不分配。