Проверка PEP8 при конкатенации кортежей кортежей - PullRequest
0 голосов
/ 18 декабря 2018

Я конкатенирую кортежи кортежей, например:

a = 1, 2
b = 1, 2
ab = a, b

c = 1, 2
d = 1, 2, 3
cd = c, d

z = ab + cd

Это, очевидно, работает должным образом, но инспектор кода PEP8 (встроенный в PyCharm) помечает последнюю строку с слабым предупреждением :

Ожидаемый тип 'Tuple [Tuple [int, int], ...]' (соответствующий универсальный тип 'Tuple [_T_co, ...]'), получил 'Tuple [Tuple[int, int], Tuple [int, int, int]] 'вместо

Я понимаю, что предполагается, что я хочу объединить только пары, и кортеж d нарушает такое предположение,Если я удаляю последний элемент в d или добавляю дополнительные элементы в другие кортежи, инспектор PEP8 не будет жаловаться.

Я могу отключить эту конкретную проверку для линии, но есть ли другиеспособ помешать инспектору PEP8 делать предположения о моих намерениях?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Явная аннотация должна решить эту проблему.

Если у вас всегда есть кортеж из двух или трех кортежей, вам необходимо:

z: Tuple[Tuple[int, int], Tuple[int, int, int]]

Если у вас естьКортеж переменной длины для кортежей переменной длины, вам нужно:

z: Tuple[Tuple[int, ...], ...]

Литерал многоточия ... является довольно интересной частью синтаксиса Python.Она такая же, как встроенная константа Ellipsis, и, помимо ее использования в аннотациях типов, может использоваться в пользовательских функциях срезов.Некоторые также используют его как альтернативу pass, как в

def stub_function():
    ...
0 голосов
/ 21 декабря 2018

Как я уже упоминал в своем первоначальном вопросе, я не хотел отключать проверку.И, прочитав предложение Скотта Колби, я начал использовать аннотации типов, поэтому мое предпочтительное решение:

from typing import Tuple
MyTuple = Tuple[Tuple[int, ...], ...]

a = 1, 2
b = 1, 2
ab = a, b       # type: MyTuple

c = 1, 2
d = 1, 2, 3
cd = c, d       # type: MyTuple

z = ab + cd

Как правило, вместо того, чтобы принимать болеутоляющее средство (отключение проверки), я предпочитаю знатьпричина моей "болезни" и ясно заявить о своих намерениях.

0 голосов
/ 18 декабря 2018

Просто поместите комментарий # noinspection PyTypeChecker прямо перед строкой кода, которую Pycharm linter игнорирует, например:

# noinspection PyTypeChecker
z = ab + cd
...