RobotFramework: Получение «Ошибка типа: Подписанные генераторы не могут использоваться с проверками классов и экземпляров»

#python #robotframework

Вопрос:

Я получаю ошибку «Ошибка типа: Подписанные генераторы не могут использоваться с проверками классов и экземпляров» при попытке использовать isinstance() функцию только при использовании через RobotFramework.

Пожалуйста, дайте мне знать, не делаю ли я что-то не так.

Создана следующая структура каталогов,

 |
|- lib/
|  |- mylib.py
|- tests/
   |- mytest.robot
 

Вот содержание mylib.py

 from typing import Union, List

class mylib:
  @staticmethod
  def fun(x: Union[str, List[str]]):
    if isinstance(x, str):
      x = [x]
    print(x)

 

Содержание mytest.robot

 *** Settings ***
Library    ../lib/mylib.py

*** Test Cases ***
My Test
    ${y}=    Create List    abc    xyz
    mylib.fun    x=${y}
 

Вот результат выполнения,

 D:tmprobot>python -m robot --loglevel DEBUG tests
==============================================================================
Tests
==============================================================================
Tests.Mytest
==============================================================================
My Test                                                               | FAIL |
TypeError: Subscripted generics cannot be used with class and instance checks
------------------------------------------------------------------------------
Tests.Mytest                                                          | FAIL |
1 test, 0 passed, 1 failed
==============================================================================
Tests                                                                 | FAIL |
1 test, 0 passed, 1 failed
==============================================================================
Output:  D:tmprobotoutput.xml
Log:     D:tmprobotlog.html
Report:  D:tmprobotreport.html
 

В log.html показывает следующую ошибку,
введите описание изображения здесь

Если я запускаю тот же код через интерпретатор Python (используя Python 3.8.5), он работает!

 >>> from typing import Union, List
>>>
>>> class mylib:
...   @staticmethod
...   def fun(x: Union[str, List[str]]):
...     if isinstance(x, str):
...       x = [x]
...     print(x)
...
>>> mylib.fun('abc')
['abc']
>>> mylib.fun(['abc', 'xyz'])
['abc', 'xyz']
>>>
 

Используя приведенную ниже версию RobotFramework.

 C:Usersamit_tendulkar>python -m robot --version
Robot Framework 4.0.1 (Python 3.8.5 on win32)
 

Что может пойти не так в работе с роботами?

ОБНОВЛЕНИЕ: Если я изменю определение функции на приведенное ниже ( List вместо List[str] ), тест начнет проходить,

 class mylib:
  @staticmethod
  def fun(x: Union[str, List]):
    if isinstance(x, str):
      x = [x]
    print(x)
 

Ответ №1:

Похоже, проблема была в более старой версии RobotFramework (4.0.1).

Я обновил свой каркас робота до версии 4.2, и приведенный выше тестовый пример начал работать без каких-либо проблем.

 PS D:personalrobot_experiment> py -m robot --version 
Robot Framework 4.1.2 (Python 3.8.10 on win32)