Импортировать класс Python, который имеет только `__new__`, в Robot Framework

Имейте класс 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__)

MyClass - это ваш собственный реализованный класс?

gachdavit 30.05.2019 22:07

@gachdavit Да, который затем импортируется в Robot Framework.

Joao Coelho 30.05.2019 22:46

Это звучит как ху проблема. Почему вы не хотите создавать метод __init__, который принимает два аргумента?

Bryan Oakley 30.05.2019 22:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

__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.

Joao Coelho 30.05.2019 22:46

Пожалуйста. __new__ не влияет на импорт. Я думаю, у вас возникла проблема во время процесса создания экземпляра. Какой именно класс импортировать нельзя из платформы Robot?

gachdavit 30.05.2019 22:49
Ответ принят как подходящий

Согласно документация по питону, __new__ будет передавать полученные аргументы в __init__. Поскольку вы не создали __init__, который принимает аргументы, поэтому вы получаете ошибку.

If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self 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 и теперь это работает. Ткс!

Joao Coelho 30.05.2019 23:00

Другие вопросы по теме