Błąd odniesienia Pythona

Błąd odniesienia Pythona
Programy Pythona składają się z wielu błędów i wyjątków, a niektóre z nich są wbudowane. Te błędy i wyjątki występują, gdy tłumacz Python napotyka błędy. Programista nie jest odporny na błędy podczas pisania programu Pythona i prawdopodobnie napotyka niezbadane błędy. Kiedy próbujemy otworzyć plik, który nie istnieje lub podzielimy liczbę przez zero, wycofany jest wyjątek. Ilekroć występują tego rodzaju błędy, Python tworzy obiekty wyjątku. Jeśli nie są odpowiednio obsługiwane, Python drukuje tracebacją tego błędu. Ten artykuł dotyczy jednego z wyjątków w Pythonie, który nazywa się błąd odniesienia.

Błąd odniesienia

W Pythonie wiele błędów i wyjątków jest podzielonych na dwie główne grupy: błędy składniowe i błędy logiczne. Błędy logiczne są również znane jako wyjątki. Wyjątki występują, gdy niepoprawne lub nielegalne operacje są uruchamiane. Błąd odniesienia należy do kategorii błędów logicznych. Błędy logiczne to te, które występują w czasie wykonywania kodu. Gdy zastosowany jest słaby serwer zastępczy w celu uzyskania dostępu do odniesienia z pamięci, wywołuje błąd odniesienia. Błąd odniesienia jest częścią wbudowanych wyjątków Pythona. Te wyjątki są rzucane po występie.

W Python program ma 4 funkcje - L, M, N i O. Jeśli używamy programu, w którym funkcja l wywołuje funkcję m, funkcja M wywołuje funkcję n, co z kolei wywołuje funkcję o. Załóżmy teraz, że istnieje wyjątek, który występuje w funkcji n, ale który nie jest rozstrzygnięty ani obsługiwany. Wyjątek jest przekazywany do funkcji m, a następnie do funkcji L. Jeśli błąd nie zostanie rozwiązany, wystąpił błąd, a program może się nie powieść.

Omówmy teraz przykład błędu odniesienia.

Przykład 1:

W tym przykładzie używamy wbudowanej funkcji w Pythonie w odniesieniu do obiektu. Spójrz szczegółowo na kod. Najpierw importujemy moduły i tworzymy klasę o nazwie „Check_Object”, w której obiekt jest przekazywany. Tutaj używamy funkcji def_init_ (self, name), a następnie definiujemy „jaźń.Nazwa ”jako nazwa. Teraz uruchom następujący kod w swoim systemie:

importować GC jako G
importować słabe jako wk
klasa Check_Object (obiekt):
def __init __ (ja, imię):
samego siebie.Nazwa = nazwa
def __del __ (jaźń):
druk („usuń to % s”) % self
print („obiekt referencyjny =”, a.nazwa)

Wynik, który otrzymamy, uruchamiając poprzedni kod, jest podany na następującej ilustracji. Widać, że otrzymujemy błąd odniesienia, który stwierdza, że ​​słabo odwołany obiekt nie istnieje.

Tutaj możemy to zobaczyć, prosząc o wydrukowanie obiektu odniesienia bez właściwej definicji obiektu, otrzymujemy błąd odniesienia.

Słaby moduł odniesienia pozwala programistowi Python na tworzenie słabych odniesień do obiektów. Słabe odniesienie do obiektu nie jest wystarczające, aby utrzymać obiekt na powierzchni i jest jedynym pozostałym odniesieniem do odniesienia. Te odniesienia są słabymi odniesieniami lub kolekcjami śmieci, które mogą zostać zniszczone przez odniesienie i pamięć, którą uwalnia się.

Przykład 2:

Weźmy kolejny przykład, aby lepiej zrozumieć ten błąd. Jak omówiliśmy wcześniej, gdy jakikolwiek obiekt jest słabo odwoływany w kodzie, występuje błąd odniesienia. Za pomocą następującego kodu próbujemy teraz wydrukować obiekty przed i po użyciu polecenia Usuń.

Tutaj używamy wbudowanej funkcji w Pythonie, aby odnosić się do obiektu i nazwać ją „obj1”. Utworzono klasę o nazwie „Check_Object”. Tutaj definiujemy dwie funkcje - „_init” i „_del_” - aby wykonać osobne funkcje.

Następnie używamy utworzonego obiektu klasy w poleceniu proxy, którym jest WK.Proxy (obj_check). Aby wydrukować po instrukcji, utworzony „obj_check” jest ustawiony na brak.

importować GC jako G
importować słabe jako wk
klasa Check_Object (obiekt):
def __init __ (ja, imię):
samego siebie.Nazwa = nazwa
def __del __ (jaźń):
druk („usuń to % s”) % self
obj_check = check_Object („obiekt”)
ABC = WK.Proxy (obj_check)
Drukuj („przed usunięciem =”, ABC.nazwa)
obj_check = brak
Drukuj („po usunięciu =”, ABC.nazwa)

Kiedy uruchamiamy poprzedni kod, otrzymujemy następujące dane wyjściowe:

Jak widać, kiedy uruchamiamy kod, otrzymujemy błąd odniesienia, ponieważ przed usunięciem obiektu Python ignoruje wyjątek w funkcji i powoduje błąd, ponieważ operandy były innego typu i nie poparły go.

Podsumowując, dlaczego występuje błąd odniesienia, możemy powiedzieć, że po usunięciu obiektu z programu występuje błąd odniesienia, który powoduje usunięcie wszystkich odniesień do obiektu. Najczęstszym sposobem wystąpienia tego błędu jest to, jeśli twój program ma klasę 1 i klasę 2, a powiedzmy, że klasa 2 jest usunięta, pozostajemy tylko z klasą 1 bez wiązania z klasą 2. Związek między klasami 1 i 2 pozostaje, ale nie ma odniesienia do klasy 2, ponieważ została usunięta lub oddzwoniona. Błąd może być spowodowany błędną konfiguracją korzeni źródłowych, a program, którego używasz, może nie wiedzieć, gdzie znaleźć link.

Jak rozstrzygać błędy odniesienia w Pythonie?

Błędy odniesienia można rozwiązać za pomocą instrukcji IF-ELSE lub instrukcji TRY-VITHOUT. Możemy zobaczyć kod, aby rozwiązać błąd odniesienia w poniższym przykładzie.

Przykład 3:

W tym przykładzie pokazujemy kod, którego można użyć do rozwiązania błędu odniesienia w programie. Ten kod nie pokazuje żadnego wyjścia. Po prostu zawiera niektóre punkty, które możesz przestrzegać w swoich programach, aby uniknąć błędów odniesienia.

def test_proxy_ref (self):
a = c ()
A.Bar = 1
Ref = słabeRef.proxy (a, jaźń.oddzwonić)
del a
Def Check (proxy):
pełnomocnik.bar
extra_collect ()
samego siebie.AsserTraises (słaby.ReferenceSerror, Check, Ref)
Jeśli test_support.is_jython:
samego siebie.AsserTraises (słaby.ReferenceSerror, Bool, Ref)
w przeciwnym razie:
samego siebie.AsserTraises (słaby.ReferenceSerorror, bool, słaberef.proxy (c ()))
samego siebie.assert_ (ja.CBCALLED == 2)

Pierwszą funkcją, której używamy, jest def test_proxy_ref (self), która jest używana do zdefiniowania testu odniesienia proxy do siebie. Następnie definiujemy, że zmienna a = c () i a.Bar = 1.

Teraz używamy składni referencyjnej „Słabe odniesienie.proxy (a, jaźń.oddzwonienie) ”, aby odwołać wspomniane odniesienie. Ta funkcja wywołania zwrotnego zapewnia, że ​​wszystkie odniesienia są unieważnione przed wywołaniem wywołania zwrotnej. Ważne jest, aby pierwsze odniesienie było odwołane z powrotem lub w prostych kategoriach. Najnowsze odniesienie jest oczyszczone na pierwszym miejscu przed wywołaniem drugiego odniesienia. Jest to test, który unieważnia wszystkie odniesienia przed wykonywaniem jakichkolwiek zwrotów, więc jest tylko wzmianka o funkcji „_weakref”. Aby sprawdzić proxy, używamy kontroli funkcji (proxy): proxy.bar. Funkcja Extra Collect jest używana do kopnięcia programu Pythona w urządzeniu i pomaga w wywołaniu wywołania wątku.

Obecnie używana jest funkcja IF-Else w Pythonie. Ta funkcja jest tworzona w celu sprawdzenia wyrażenia testowego i wykonania instrukcji „jeśli” w przypadku, gdy warunek jest prawdziwy. W przeciwnym razie instrukcja „else” jest wykonywana.

Wniosek

W tym poście dowiedzieliśmy się, że błąd odniesienia występuje z powodu słabego odniesienia proxy. Wiele razy błąd może wystąpić w programie, błąd składni lub błąd logiczny. Błąd odniesienia należy do kategorii błędu logicznego. Wyjaśniliśmy, w których przypadkach występuje błąd odniesienia za pomocą przykładu. Wypróbuj te przykłady w swoim systemie, aby lepiej zrozumieć temat błędów odniesienia.