Po pierwsze: wiem, że istnieje już wiele pytań i odpowiedzi na temat importu okrężnego.Python: wymagany jest cykliczny import sprawdzania typu.
Odpowiedź brzmi mniej więcej: "poprawnie zaprojektuj strukturę modułu/klasy i nie będziesz potrzebować importu cyklicznego". To prawda. Bardzo się starałem, aby stworzyć właściwy projekt dla mojego obecnego projektu. W mojej opinii udało mi się to osiągnąć.
Ale mój konkretny problem jest następujący: Potrzebuję kontroli typu w module, który jest już zaimportowany przez moduł zawierający klasę do sprawdzenia. Ale to powoduje błąd importu.
tak:
foo.py:
from bar import Bar
class Foo(object):
def __init__(self):
self.__bar = Bar(self)
bar.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not isinstance(arg_instance_of_foo, Foo):
raise TypeError()
Rozwiązanie 1: Gdybym zmodyfikowano go do sprawdzenia typu przez porównanie smyczkową , to będzie działać. Ale nie podoba mi się to rozwiązanie (porównywanie ciągów jest dość kosztowne w przypadku prostego sprawdzenia typu i może spowodować problem z refaktoryzacją).
bar_modified.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not arg_instance_of_foo.__class__.__name__ == "Foo":
raise TypeError()
Rozwiązanie 2: mogę również zapakować dwie klasy w jednym module. Ale mój projekt ma wiele różnych klas, takich jak przykład "Bar", i chcę je oddzielić na różne pliki modułów.
Po tym, jak moje własne 2 rozwiązania nie są dla mnie rozwiązaniem: czy ktoś ma lepsze rozwiązanie tego problemu?
Jak na temat korzystania kaczka wpisywanie? –
Zobacz https://stackoverflow.com/questions/39740632/python-type-hinting-without-cicult-imports dla poprawnej odpowiedzi. –