Различия в типизации Python между встроенными созданными параметрами и переменнымиPython

Программы на Python
Anonymous
 Различия в типизации Python между встроенными созданными параметрами и переменными

Сообщение Anonymous »

Преамбула

Я использую метод write_excel Polars, у которого есть параметр columns_formats, которому нужен ColumnFormatDict, определенный здесь и ниже

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

ColumnFormatDict: TypeAlias = Mapping[
# dict of colname(s) or selector(s) to format string or dict
Union[ColumnNameOrSelector, tuple[ColumnNameOrSelector, ...]],
Union[str, Mapping[str, str]],
]

ColumnNameOrSelector: TypeAlias = Union[str, SelectorType]

SelectorType: TypeAlias = "Selector"
Если я использую это так:

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

df.write_excel(..., column_formats={"a":"#,##0;[Red]-#,##0"})
тогда средство проверки типов не будет жаловаться.
Если да:

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

column_formats = {"a":"#,##0;[Red]-#,##0"}
df.write_excel(..., column_formats=column_formats)
тогда он жалуется:

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

Argument of type "dict[str, str]" cannot be assigned to parameter "column_formats" of type "ColumnFormatDict | None" in function "write_excel"
Type "dict[str, str]" is not assignable to type "ColumnFormatDict | None"
"dict[str, str]" is not assignable to "Mapping[ColumnNameOrSelector | tuple[ColumnNameOrSelector, ...], str | Mapping[str, str]]"
Type parameter "_KT@Mapping" is invariant, but "str" is not the same as "ColumnNameOrSelector | tuple[ColumnNameOrSelector, ...]"
"dict[str, str]" is not assignable to "None"
где соответствующая строка: Параметр типа "_KT@Mapping" является инвариантным, но "str" ​​не совпадает с "ColumnNameOrSelector | tuple[ColumnNameOrSelector, ...]"
Я обнаружил, что если я аннотирую свою переменную как

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

column_formats:dict[str|cs.Selector|tuple[str|cs.Selector], str]={"a":"abc"}
тогда он не будет жаловаться, но параметр должен быть гибким, а предполагаемая гибкость, по-видимому, делает его менее гибким.

Вопросы:

  • Почему в первом случае str является допустимым ColumnNameOrSelector | tuple[ColumnNameOrSelector, ...], но во втором случае это не так?
Интересно, что он жалуется только на ключ, а не на часть значения сопоставления, другими словами, мне не пришлось аннотировать его как dict[str|cs.Selector|tuple[str|cs.Selector], str|dict[str,str]]
  • Кроме того, предположим, что я хочу добавить PR для изменения ColumnNameOrSelector, есть ли способ определить его так, чтобы мое второе использование не генерировало предупреждение о типе без явной аннотации?
Предполагая, что это может быть готово, я предполагаю, что для каждой ключевой возможности должно быть сопоставление, так что, возможно, эту (или, может быть, даже эту последнюю возможность кортежа необходимо разделить на 4-й случай сопоставления.

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

ColumnFormatDict: TypeAlias = Union[
Mapping[str, Union[str, Mapping[str, str]]],
Mapping[SelectorType, Union[str, Mapping[str, str]]],
Mapping[tuple[str|SelectorType, ...], Union[str, Mapping[str, str]]],
]
  • Это предположение на правильном пути или нет?


Подробнее здесь: https://stackoverflow.com/questions/797 ... -variables

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