Как избежать того, чтобы класс Foo рассматривался как __main__.Foo?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как избежать того, чтобы класс Foo рассматривался как __main__.Foo?

Сообщение Anonymous »

У меня есть два класса, которые разделены в двух разных файлах ( и bar.py) для организационных целей Foo и Bar. Оба они реализуют метод __add__. Я хочу, чтобы оба метода __add__ работали независимо от того, является ли __other__ экземпляром класса Foo или Bar.
Однако, если foo< /code> — это экземпляр класса Foo, а bar — это экземпляр класса Bar, и я пытаюсь добавить bar + foo в модуль foo, Boo будет обрабатывать foo как __main__.Foo и выдавать ошибку TypeError. Рассматриваемый код можно суммировать следующим образом:

Код: Выделить всё

from typing import Union, Any

import bar as b

FooBar = Union['Foo', 'b.Bar']

class Foo:
message: str

def __init__(self, message: str) -> None:
self.message = message

def __add__(self, other: Any) -> 'Foo':
if not isinstance(other, (Foo, b.Bar)):
raise TypeError('can only add Foo and Bar')
return Foo(' '.join((self.message, other.message)))

def test():
foo = Foo('Jalim')
bar = b.Bar('Rabei')
foobar = foo + bar # works just fine
print(foobar.message)
barfoo = bar + foo # raises TypeError because it receives __main__.Foo
print(barfoo.message)

if __name__ == '__main__':
test()

Код: Выделить всё

from typing import Union, Any

import foo

FooBar = Union['foo.Foo', 'Bar']

class Bar:
message: str

def __init__(self, message: str) -> None:
self.message = message

def __add__(self, other: Any) -> 'Bar':
if not isinstance(other, (foo.Foo, Bar)):
print(f'{type(other) = }')
raise TypeError('can only add Foo and Bar')
return Bar(''.join((self.message, other.message)))

Я знаю, что могу запустить test() в другом файле, но мне хотелось бы иметь возможность запускать его из foo.py и при этом обходить, если возможно, преобразование из Foo в __main__.Foo.
Сначала я попробовал использовать псевдоним типа FooBar вместо кортежа (Foo , бар.Бар). Однако, поскольку FooBar на самом деле не содержит типов, а вместо этого содержит ForwardRef, его нельзя использовать в isinstance. Я также не могу объединить Foo и Bar в Union, потому что это создаст циклический импорт.

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-main-foo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»