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.
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]Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again[/code].
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]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
[/code]
Ich möchte verhindern, dass illegal_usage_of_T.py den Alias vom Typ T verwendet.
[code]import module
foo:module.T = module.function()
[/code]
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:
[*][b]Umbenennen des Typalias:[/b] 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.
[*][b]Verwendung von if TYPE_CHECKING:[/b] 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.
[*][b]Exporte einschränken:[/b] 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]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"]
[/code]
Und hier ist die Datei illegal_usage_of_T.py:
[code]import module
foo:module._T = module.function() # Still works
[/code]
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.