В чем разница между «Должно быть правдой $ {list} == ['a', 'b', 'c']» и «Должно быть правдой» $ list == ['a', 'b', ' c '] "? - PullRequest
1 голос
/ 17 января 2020

Рассмотрим следующий код во встроенном library-tests.robot:

*** Test Cases ***
Use "Create List"
   #  The returned list can be assigned both to ${scalar} and @{list} variables
   @{list} =   Create List     a   b   c
   Should Be True      ${list} == ['a', 'b', 'c']    # (1)
   Should Be True      $list == ['a', 'b', 'c']      # (2)

Для меня (1) и (2) должны различаться по исполнению, даже если они оба проходят.

В (1) , ${list} заменяется строковым представлением @list (т.е. ['a', 'b', 'c']), в результате чего выражение в виде строки :

['a', 'b', 'c'] == ['a', 'b', 'c']

( 1) похоже на запуск eval ("['a', 'b', 'c'] == ['a', 'b', 'c']") на консоли python. Это правильно?

(2) НЕ похоже на запуск eval ("['a', 'b', 'c'] == ['a', 'b', ' c '] ") на консоли python ; Сначала $list в пространстве имен оценки относится к @{list} объекту из Robot.

$ list == ['a', 'b', 'c']

Как выглядит список справа (то есть ['a', 'b', 'c'] выше) обработано? Он анализируется как строка и на основе результата анализа новый объект списка помещается справа от оператора ==?

1 Ответ

2 голосов
/ 17 января 2020

Короткий ответ заключается в том, что робот преобразует ${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']").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...