中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

annotations怎么在python3中使用

發布時間:2021-01-20 14:22:11 來源:億速云 閱讀:287 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關annotations怎么在python3中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1、類型注解簡介

Python是一種動態類型化的語言,不會強制使用類型提示,但為了更明確形參類型,自python3.5開始,PEP484為python引入了類型注解(type hints)

示例如下:

annotations怎么在python3中使用 

2、常見的數據類型

  • int,long,float: 整型,長整形,浮點型

  • bool,str: 布爾型,字符串類型

  • List, Tuple, Dict, Set: 列表,元組,字典, 集合

  • Iterable,Iterator: 可迭代類型,迭代器類型

  • Generator:生成器類型

  • Sequence: 序列

3、基本的類型指定

def test(a: int, b: str) -> str:
  print(a, b)
  return 200


if __name__ == '__main__':
  test('test', 'abc')

函數test,a:int 指定了輸入參數a為int類型,b:str b為str類型,-> str 返回值為srt類型。可以看到,在方法中,我們最終返回了一個int,此時pycharm就會有警告;

當調用這個方法時,參數a 輸入的是字符串,此時也會有警告;

but…,pycharm這玩意兒 只是提出了警告,但實際上運行是不會報錯,畢竟python的本質還是動態語言

annotations怎么在python3中使用

4、復雜的類型指定

指定列表

from typing import List
Vector = List[float]


def scale(scalar: float, vector: Vector) -> Vector:
  return [scalar * num for num in vector]


# type checks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
print(new_vector)

指定 字典、元組 類型

from typing import Dict, Tuple, Sequence

ConnectionOptions = Dict[str, str]
Address = Tuple[str, int]
Server = Tuple[Address, ConnectionOptions]


def broadcast_message(message: str, servers: Sequence[Server]) -> None:
  print(message)
  print(servers)

# The static type checker will treat the previous type signature as
# being exactly equivalent to this one.


if __name__ == '__main__':
  broadcast_message('OK', [(('127.0.0.1', 8080), {"method": "GET"})])

annotations怎么在python3中使用

這里需要注意,元組這個類型是比較特殊的,因為它是不可變的。
所以,當我們指定Tuple[str, str]時,就只能傳入長度為2,并且元組中的所有元素都是str類型

5、創建變量時的類型指定

對于常量或者變量添加注釋

from typing import NamedTuple


class Employee(NamedTuple):
  name: str
  id: int = 3


employee = Employee('Guido')
# assert employee.id == 3  # 當類型一致時,不會輸出內容,反之報錯
assert employee.id == '3'  # 當類型一致時,不會輸出內容,反之報錯
# AssertionError

指定一個變量odd,顯式的聲明了它應該是整數列表。如果使用mypy來執行這個腳本,將不會收到任何提示輸出,因為已經正確地傳遞了期望的參數去執行所有操作。

from typing import List

def odd_numbers(numbers: List) -> List:
  odd: List[int] = []
  for number in numbers:
    if number % 2:
      odd.append(number)

  return odd

if __name__ == '__main__':
  numbers = list(range(10))
  print(odd_numbers(numbers))

mypy 安裝

pip install mypy

執行 mypy file,正常情況下不會報錯

C:\Users\Sunny_Future\AppData\Roaming\Python\Python36\Scripts\mypy.exe tests.py

# 指定 環境變量或者 linux 下可以直接執行 mypy
# mypy tests.py

Success: no issues found in 1 source file

annotations怎么在python3中使用

接下來,嘗試更改一下代碼,試圖去添加整形之外的其他類型內容!那么執行則會檢查報錯

from typing import List


def odd_numbers(numbers: List) -> List:
  odd: List[int] = []
  for number in numbers:
    if number % 2:
      odd.append(number)

  odd.append('foo')

  return odd


if __name__ == '__main__':
  numbers = list(range(10))
  print(odd_numbers(numbers))

代碼中添加一個行新代碼,將一個字符串foo附加到整數列表中。現在,如果我們針對這個版本的代碼來運行mypy

C:\Users\Sunny_Future\AppData\Roaming\Python\Python36\Scripts\mypy.exe tests.py

annotations怎么在python3中使用

tests.py:114: error: Argument 1 to “append” of “list” has incompatible type “str”; expected “int”
Found 1 error in 1 file (checked 1 source file)

6、 泛型指定

from typing import Sequence, TypeVar, Union

T = TypeVar('T')   # Declare type variable


def first(l: Sequence[T]) -> T:  # Generic function
  return l[0]


T = TypeVar('T')       # Can be anything
A = TypeVar('A', str, bytes) # Must be str or bytes
A = Union[str, None]     # Must be str or None

7、再次重申

在Python 3.5中,你需要做變量聲明,但是必須將聲明放在注釋中:

# Python 3.6
odd: List[int] = []

# Python 3.5
odd = [] # type: List[int]

如果使用Python 3.5的變量注釋語法,mypy仍將正確標記該錯誤。你必須在 #井號之后指定type:。如果你刪除它,那么它就不再是變量注釋了。基本上PEP 526增加的所有內容都為了使語言更加統一。

8、不足之處

雖然指定了 List[int] 即由 int 組成的列表,但是,實際中,只要這個列表中存在 int(其他的可以為任何類型),pycharm就不會出現警告,使用 mypy 才能檢測出警告!

from typing import List


def test(b: List[int]) -> str:
  print(b)
  return 'test'


if __name__ == '__main__':
  test([1, 'a'])

pycharm 并沒有檢測出類型錯誤,沒有告警

annotations怎么在python3中使用mypy

工具 檢測到 類型異常,并進行了報錯

annotations怎么在python3中使用 

9、demo

# py2 引用
from__future__import annotations
class Starship:
  captain: str = 'Picard'
  damage: int
  stats: ClassVar[Dict[str, int]] = {}

  def __init__(self, damage: int, captain: str = None):
    self.damage = damage
    if captain:
      self.captain = captain # Else keep the default

  def hit(self):
    Starship.stats['hits'] = Starship.stats.get('hits', 0) + 1

enterprise_d = Starship(3000)
enterprise_d.stats = {} # Flagged as error by a type checker
Starship.stats = {} # This is OK
from typing import Dict
class Player:
  ...
players: Dict[str, Player]
__points: int

print(__annotations__)
# prints: {'players': typing.Dict[str, __main__.Player],
#     '_Player__points': <class 'int'>}
class C:
  __annotations__ = 42
  x: int = 5 # raises TypeError

關于annotations怎么在python3中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜昌市| 呼图壁县| 盐亭县| 扎鲁特旗| 启东市| 元朗区| 哈尔滨市| 武宁县| 县级市| 伊宁县| 通山县| 海兴县| 襄城县| 商河县| 唐河县| 清苑县| 日照市| 荆门市| 黄骅市| 丰顺县| 景洪市| 霍城县| 黄大仙区| 依安县| 乌兰浩特市| 莱西市| 泰安市| 双城市| 甘肃省| 伊宁市| 和平县| 建湖县| 陇川县| 马鞍山市| 将乐县| 车险| 大英县| 长海县| 临颍县| 板桥市| 罗田县|