Wie kann verhindert werden, dass in einer Stub-Datei definierte Typaliase in anderen Modulen verwendet werden?Python

Python-Programme
Guest
 Wie kann verhindert werden, dass in einer Stub-Datei definierte Typaliase in anderen Modulen verwendet werden?

Post by Guest »

Ich arbeite an einem Python 3.13.1-Projekt und verwende mypy 1.14.0 für die statische Typprüfung.

Ich habe ein Modul namens module.py mit einer Funktion Funktion, die einen Typ mit einem sehr langen Namen zurückgibt,

Code: Select all

Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again
.

Um den Code besser lesbar zu machen, habe ich einen Typalias T in der entsprechenden Stub-Datei module.pyi definiert.Hier ist eine vereinfachte Version meines Codes module.pyi:

Code: Select all

T = Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again

def function()->T: pass

class Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again: pass
Ich möchte verhindern, dass illegal_usage_of_T.py den Alias ​​vom Typ T verwendet.

Code: Select all

import module

foo:module.T = module.function()
Wenn ich mypy illegal_usage_of_T.py ausführe, möchte ich im Idealfall eine Fehlermeldung erhalten, die darauf hinweist, dass der Typ T undefiniert ist.
Was ich versucht habe
Google-Suche
Ich habe bei Google nach „Mypy-Typ-Alias, der nur in Stub-Datei verwendet wird“ gesucht. konnte aber keine Lösung finden, die das verhindert mypy verhindert, dass der Typalias in anderen Modulen erkannt wird. Ich hatte erwartet, dass die Definition von T nur in der Stub-Datei den Umfang einschränken würde, aber es scheint, dass mypy den Typalias auch in anderen Modulen finden kann.
Code korrigieren< /h5>
Ich habe mehrere Ansätze ausprobiert, darunter:

[*]Umbenennen des Typalias: I T wurde in _T geändert, um die Wahrscheinlichkeit zu verringern, dass es gefunden wird von anderen Modulen, aber das hat das Problem nicht behoben.
[*]Verwendung von if TYPE_CHECKING: Ich habe versucht, den Typalias innerhalb eines if TYPE_CHECKING bedingt zu definieren -Block, aber das hat auch nicht verhindert, dass der Typalias in anderen Modulen verwendet wird.
[*]Exporte einschränken: Ich habe __all__ = [" hinzugefügt Funktion", „Type_whose_name_is_so_long_that_we_do_not_want_call_it_over_and_over_again“] zur Datei module.pyi hinzugefügt, um explizit zu steuern, welche Namen exportiert werden, aber auf den Typalias T konnte weiterhin zugegriffen werden.

Hier ist der geänderte Code für module.pyi:

Code: Select all

from typing import TYPE_CHECKING

if TYPE_CHECKING:
_T = Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again

def function()->_T: pass

class Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again: pass

__all__ = ["function", "Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again"]
Und hier ist die Datei illegal_usage_of_T.py:

Code: Select all

import module

foo:module._T = module.function()  # Still works
Ich habe erwartet, dass mindestens einer dieser Ansätze verhindern würde, dass illegal_usage_of_T.py auf den Alias ​​vom Typ _T zugreift, aber keiner davon hat funktioniert.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post