Как предотвратить использование псевдонима типа, определенного в файле-заглушке, в других модулях?Python

Программы на Python
Ответить
Anonymous
 Как предотвратить использование псевдонима типа, определенного в файле-заглушке, в других модулях?

Сообщение Anonymous »

Я работаю над проектом Python 3.13.1, используя mypy 1.14.0 для статической проверки типов.

У меня есть модуль с именем Module.py с функцией функция, которая возвращает тип с очень длинным именем,

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

Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again
.

Чтобы сделать код более читабельным, я определил псевдоним типа T в соответствующем файле-заглушке mod.pyi .Вот упрощенная версия моего кода mod.pyi:

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

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
Я хочу запретить подписавшимся на незаконное_usage_of_T.py использовать псевдоним типа T.

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

import module

foo:module.T = module.function()
В идеале, когда я запускаю mypy ignore_usage_of_T.py, я хотел бы получить сообщение об ошибке, указывающее, что тип T не определен.
Что я пробовал
Поиск в Google
Я искал в Google «псевдоним типа mypy, используемый только в файле-заглушке» но не смог найти решение, которое предотвращает mypy от распознавания псевдонима типа в других модулях. Я ожидал, что определение T только в файле-заглушке ограничит его область действия, но похоже, что mypy способен найти псевдоним типа даже в других модулях.
исправление кода< /h5>
Я попробовал несколько подходов, в том числе:

[*]Переименование псевдонима типа: I изменил T на _T, чтобы снизить вероятность его обнаружения другими модулями, но это не решило проблему.
[*]Использование if TYPE_CHECKING: Я попробовал условно определить псевдоним типа внутри if TYPE_CHECKING , но это также не помешало использованию псевдонима типа в других модулях.
[*]Ограничение экспорта: я добавил __all__ = [" функция", «Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again»] в файл Module.pyi, чтобы явно контролировать, какие имена экспортируются, но псевдоним типа T все еще был доступен.

Вот измененный код модуля.pyi:

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

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"]
А вот файл незаконного_usage_of_T.py:

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

import module

foo:module._T = module.function()  # Still works
Я ожидал, что хотя бы один из этих подходов предотвратит доступ незаконного_usage_of_T.py к псевдониму типа _T, но ни один из них не сработал.


Подробнее здесь: https://stackoverflow.com/questions/793 ... her-module
Ответить

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

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

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

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

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