Насколько Google Colab поддерживает набор текста на Python?

Я ввел код, в котором были эти строки.

from typing import Dict, List, Set, Tuple

def pairs_sum_to_k(a_set: Set[int], k: int) -> List[Tuple[int, int]]:
    ...

Код скомпилирован и запущен. Это хорошо. Также хорошо, что когда я пытался импортировать что-то, чего не было в typing Colab, генерировалось сообщение об ошибке.

Что нехорошо, так это то, что, когда подсказки типа не согласовывались с программой, например, при изменении типа возвращаемого значения на простой int, Колаб не жаловался. Это говорит о том, что Colab может работать с синтаксисом подсказок типа, но ничего не делает с объявлениями типов. Так ли это? Какую поддержку набора текста, если таковая имеется, мне следует ожидать от Colab?

Спасибо.


person RussAbbott    schedule 28.07.2020    source источник


Ответы (1)


Аннотации типов в Python - это просто украшение - Python изначально не выполняет никакой проверки типов. Из документов Python:

Примечание. Среда выполнения Python не применяет аннотации типов функций и переменных. Они могут использоваться сторонними инструментами, такими как средства проверки типов, IDE, линтеры и т. Д.

Если вы хотите проверить свои типы, вам необходимо использовать такой инструмент, как mypy, который предназначен для этого. .

Я не знаю о каких-либо встроенных функциях проверки типов в Colab, но это относительно просто определить самостоятельно. Например, вы можете создать магию ячейки Jupyter, которая выполняет проверку типов содержимого ячейки с помощью mypy:

# Simple mypy cell magic for Colab
!pip install mypy
from IPython.core.magic import register_cell_magic
from IPython import get_ipython
from mypy import api

@register_cell_magic
def mypy(line, cell):
  for output in api.run(['-c', '\n' + cell] + line.split()):
    if output and not output.startswith('Success'):
      raise TypeError(output)
  get_ipython().run_cell(cell)

Тогда вы можете использовать это так:

%%mypy

def foo(x: int) -> int:
  return 2 * x

foo('a')

После выполнения это результат:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-21dcff84b262> in <module>()
----> 1 get_ipython().run_cell_magic('mypy', '', "\ndef foo(x: int) -> int:\n  return 2 * x\n\nfoo('a')")

/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
   2115             magic_arg_s = self.var_expand(line, stack_depth)
   2116             with self.builtin_trap:
-> 2117                 result = fn(magic_arg_s, cell)
   2118             return result
   2119 

<ipython-input-5-d2e45a31f6bb> in mypy(line, cell)
      8   for output in api.run(['-c', '\n' + cell] + line.split()):
      9     if output:
---> 10       raise TypeError(output)
     11   get_ipython().run_cell(cell)

TypeError: <string>:6: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)
person jakevdp    schedule 28.07.2020
comment
Спасибо. Я настолько привык к тому, как PyCharm выполняет для меня проверку типов, что надеялся, что Colab сделает что-то подобное. - person RussAbbott; 29.07.2020
comment
Эта магия ячейки работает нормально, пока весь проверяемый код находится в этой ячейке. Но если foo() находится в ячейке, которая была запущена ранее, и я затем вызываю foo() во второй ячейке, тогда mypy вызывает ошибку для этой второй ячейки, говоря NameError: name 'foo' is not defined. Как я могу исправить эту проблему? - person stackoverflowuser2010; 23.11.2020
comment
@ stackoverflowuser2010 вы можете загрузить ноутбук, установить nbQA (pip install -U nbqa), а затем запустить nbqa mypy your_notebook_name.ipynb - person ignoring_gravity; 29.06.2021
comment
@ignoring_gravity: Было бы здорово, если бы я мог выполнять проверку типов внутри записной книжки, не скачивая ее. - person stackoverflowuser2010; 09.07.2021
comment
@ stackoverflowuser2010 из записной книжки, должно быть возможно написать !nbqa mypy your_notebook_name.ipynb - если это не сработает для вас, пожалуйста, откройте вопрос / запрос функции на github.com/nbQA-dev/nbQA/issues - person ignoring_gravity; 09.07.2021