我正在编辑一个自定义关键字的变量,我在满足条件时有条件运行。起初,我认为参数没有返回,因此我创建了一个全局关键字并在代码的这一部分内进行了修改,并且在返回主和登录该变量时,它仍然具有我声明的该全局变量的值。如果运行运行关键字时,是否有一个错误可以防止修改变量?
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 Variable
和Set 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
在这里无济于事(为什么 - 练习以后:)。
正统的方式是从关键字返回值,并使用它。您在示例代码中执行的操作 - 返回值,但不要分配。