Имейте класс python, который импортируется в Robot Framework следующим образом:
Питон:MyClass.py
class MyClass:
def __new__(cls, a, b):
# implementation here
Каркас робота:MyTest.robot
*** Settings ***
Library MyClass.py a=1 b=2
Получение ошибки Error in file 'MyTest.robot': Test Library 'MyClass' expected 0 arguments, got 2.
Я понимаю, что ошибка связана с тем, что MyClass
не определен __init__
(если он определен, ошибки импорта нет).
Мой вопрос: как я могу импортировать MyClass.py
, который определен __new__
, но не __init__
?
(не вдаваясь в подробности, почему у меня __new__
, а не __init__
)
@gachdavit Да, который затем импортируется в Robot Framework.
Это звучит как ху проблема. Почему вы не хотите создавать метод __init__
, который принимает два аргумента?
__new__
отвечает за создание экземпляра, а __init__
просто выполняет инициализацию после создания экземпляра. Сначала всегда называют __new__
, а потом __init__
. __new__
всегда @staticmethod
по умолчанию, но вы также можете использовать декоратор @staticmethod
(то же самое).
class Foo:
@staticmethod
def __new__(cls):
print('Foo.__new__ is called')
obj = super().__new__(cls)
print(obj) # <__main__.Foo object at 0x7f82c1403588> This is "f" object.
return obj
def __init__(self, *args, **kwargs):
print('Foo.__init__ is called !!!')
f = Foo()
Надеюсь, это поможет вам.
Tx, но это объясняет свойство __new__
vs __init__
, но не объясняет, как я могу импортировать класс в Robot Framework.
Пожалуйста. __new__
не влияет на импорт. Я думаю, у вас возникла проблема во время процесса создания экземпляра. Какой именно класс импортировать нельзя из платформы Robot?
Согласно документация по питону, __new__
будет передавать полученные аргументы в __init__
. Поскольку вы не создали __init__
, который принимает аргументы, поэтому вы получаете ошибку.
If
__new__()
returns an instance of cls, then the new instance’s__init__()
method will be invoked like__init__(self[, ...])
, whereself
is the new instance and the remaining arguments are the same as were passed to__new__()
.
Если вы не хотите, чтобы вызывался __init__
, вам может помочь этот вопрос: Можно ли предотвратить вызов init?
Понимаю. Вы и @gachdavit оба говорили одно и то же. Я добавил def __init__(self, *args, **kwargs): pass
и теперь это работает. Ткс!
MyClass - это ваш собственный реализованный класс?