Вы описываете две отдельные проблемы - это не 2 вопроса, а два подхода к обмену состоянием, с которым вы столкнулись.
Позвольте мне заняться использованием "глобальной" переменной - ${WORKAROUND}
, чтобы передавать информацию из ключевого слова (потому что это проще;) .
Поведение, которое вы видите из-за области видимости переменных. Рассмотрим этот псевдокод:
a = 5
print(a) # 5
def keyword():
a = 10
print(a)
keyword() # 10
print(a) # 5?
Так почему последний print()
выводит 5?
Потому что в области видимости это значение переменной. То, что происходит в keyword()
, изолировано (по умолчанию) ; Вы создаете переменную, которая также называется «а», и присваиваете ей значение. В этот момент вы скрываете переменную «a» от внешней области видимости - она продолжает существовать для программы, но больше недоступна из keyword()
. Как только keyword()
завершается, его «а» исчезает, а глобальное остается неизменным.
Кстати, этот список - python, на котором основан язык Robot Framework и принципы, которым он более или менее соответствует.
То же самое происходит с вашим кодом - переменная ${WORKAROUND}
определена в регистре или ключевом слове, и вы определяете новую с тем же именем внутри Get cell value
. Таким образом, все, что вы делаете с этим ключевым словом, не отражается на исходном во внешней области.
К счастью, существует простой обходной путь (в Robot Framework) - используйте Set Test Variable
внутри ключевого слова, чтобы перезаписать переменную из внешней области видимости. Все последующие использования ${WORKAROUND}
в этом случае будут иметь измененное значение. Есть также похожие ключевые слова Set Suite Variable
и Set Global Variable
, которые помещают переменную в более высокую (и самую высокую) область видимости.
Теперь второй случай - передача переменной в качестве аргумента и изменение ее внутри ключевого слова ~ method ~, в надежде, что она будет изменена в вызывающей области.
Я собирался написать что-то длинное и столь же скучное, как первая часть для передачи по значению по сравнению с передачей по ссылке, и привязки имен -> объектов, но - нет, я буду
а) оставьте это здесь - https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-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
тут не поможет (почему - упражнение на потом:).
Традиционный способ - вернуть значение из ключевого слова и использовать его. Что вы делаете в своем примере кода - возвращайте значения, но не присваивайте.