Короткий ответ заключается в том, что робот преобразует ${list}
в строку перед вычислением выражения, но сделает переменную напрямую доступной для python с помощью $list
.
Это описано в Оценка выражений раздел документации библиотеки Builtin:
Когда переменная используется в выражении [sic] с использованием обычного синтаксиса $ {variable}, ее значение заменяется на [sic] до того, как выражение будет оценено. Это означает, что значение, используемое в выражении, будет строковым представлением значения переменной, а не самого значения переменной. Это не проблема с числами и другими объектами, которые имеют строковое представление, которое может быть оценено непосредственно, но с другими объектами поведение зависит от строкового представления. Самое важное, что строки всегда должны заключаться в кавычки, и если они могут содержать символы новой строки, они должны быть в тройных кавычках
...
Начиная с Robot Framework 2.9, сами переменные автоматически доступны в пространстве имен оценки. К ним можно получить доступ, используя специальный синтаксис переменной без фигурных скобок, таких как $ variable. Эти переменные никогда не должны заключаться в кавычки, и на самом деле они даже не заменяются внутри строк.
Вы написали «Для меня (1) и (2) должны отличаться по исполнению, даже если они оба проходят. ".
Они оба проходят из-за того, что строковое представление списка выглядит как список для python. Это вызвано в первом абзаце, который я цитировал выше:
... Это не проблема с числами и другими объектами, которые имеют строковое представление, которое может быть оценено непосредственно, но с другими объектами поведение зависит от строкового представления ...
Чтобы увидеть пример, в котором у них разное поведение, используйте переменную, содержащую строку.
Пример:
*** Variables ***
${test} hello, world
*** Test Cases ***
Passing Example
should be true $test=='hello, world'
Failing Example
# this will fail with the following error:
# Evaluating expression 'hello, world=='hello, world'' failed: NameError: name 'hello' is not defined
should be true ${test}=='hello, world' # fails
Позже вы отредактировали вопрос, задав следующий вопрос:
"Как выглядит список справа (то есть ['a', 'b', 'c'] выше) обработано? Разбирается ли оно как строка и основано ли на результате синтаксического анализа новый объект списка помещается справа от оператора ==? "
Короче говоря, да.
Когда роботу присваивается $list == ['a', 'b', 'c']
, это изначально строка, которая выглядит буквально как $list == ['a', 'b', 'c']
. Поскольку правая часть не имеет переменных, то именно то, что передается в eval
, и eval видит строку, которая выглядит как список, поэтому он создает новый список перед выполнением сравнения.
Для значения слева робот фактически просто удаляет $
, делая переменную list
доступной, так что это так же, как если бы вы назвали eval
следующим образом: eval("list == ['a', 'b', 'c']")
.