成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 類型提示的初級入門

譯文
開發 后端
了解如何使用Python的可選類型提示語法來創建更簡潔、更高效的代碼庫。

 [[419725]]

【51CTO.com快譯】Python語言被認為是一種最好的“動態但強類型”語言。類型不與事物的名稱相關聯,而是與事物本身相關聯。

這使得 Python語言對開發人員來說既靈活又方便,因為如果只是將編寫一個快速切邏輯性不強的腳本,就不必嚴格定義和跟蹤變量類型。但是對于更大的項目來說,尤其是第三方使用的庫,了解哪些對象類型與哪些變量相關聯是有幫助的。

一段時間以來,Python 已經能夠以某種形式用類型信息“注釋”名稱。在 Python 3.5 中,類型提示正式成為語言的一部分(PEP 484)。使用 linter 或代碼檢查工具,開發人員可以跨代碼庫檢查變量及其類型的一致性,并對以前很難或者不可能實現的代碼執行靜態分析。所有這些都是在代碼運行之前提前完成的。

在本文中,我們將探討 Python 類型提示的一些基本示例。但首先我們要介紹一個常見誤解,即什么是Python類型提示,有什么用途。

Python 如何使用類型提示

關于 Python 類型提示的一個主要誤解是如何使用。運行時不使用Python 類型提示。事實上,在程序運行時,您提供的所有類型信息都已被刪除。Python 類型提示只會被正在使用的類型檢查系統(例如在編輯器或 IDE 中)提前使用。換句話說,Python 的類型提示是針對開發人員的,而不是針對運行時的。

這聽起來可能有悖常理,尤其是對于使用過類型聲明不是可選語言時的開發人員來說。但是 Python 的開發團隊已經明確表示,類型提示并不是核心 Python 語言成為靜態類型的征兆。它們是開發人員向代碼庫添加元數據的一種方式,以便在開發過程中更輕松地執行靜態分析。

有人推測,Python類型提示能可能會產生一種靜態類型的語言分支,這可能是使Python更快的一種方法。在某些方面,已經證實了這種推測。Cython 使用類型提示(盡管大部分是它自己特有的類型)從 Python 生成 C 代碼, mypyc項目使用 Python 的本機類型提示來完成同樣的工作。

但是,這些項目被更恰當地認為是對核心 Python 語言的補充,而不是 Python 發展方向的標志。Python 中類型提示的主要目的是為開發人員提供一種方法,使他們的代碼盡可能具有自描述性,這既是為了他們自己的利益,也是為了其他開發者的利益。

Python 類型提示的語法

Python 中的類型提示在命名空間中第一次調用名稱之后涉及冒號和類型聲明。例如:

  1. name: str 
  2. age: int 
  3. name = input("Your name?"
  4. age = int(input("Your age?")) 

類型提示name和age的第一個聲明確保將來在該名稱空間中使用這些名稱時,將對照這些類型進行檢查。例如,此代碼將無效:

  1. name: int 
  2. age: int 
  3. name = input("Your name?"
  4. age = int(input("Your age?")) 

因為我們已經聲明name為一個int,并且input默認返回一個字符串,類型檢查器將無法查詢到。

Python 類型檢查系統將盡可能地推斷類型。例如,假設我們使用了以下代碼,但沒有前面的類型聲明:

  1. name = input("Your name?"
  2. age = int(input("Your age?")) 

在這種情況下,類型檢查器將能夠推斷出name是一個字符串(因為input()不返回任何其他內容),而age是一個int(因為int()不返回任何其他內容)。

類型提示 Python 函數

Python 函數也可以是類型提示,以便提前記錄它們接受和返回的值。例如下面的代碼:

  1. greeting = "Hello, {}, you're {} years old" 
  2. def greet(user, age): 
  3.     return greeting.format(user, age) 
  4. name = input("Your name?"
  5. age = int(input("How old are you?")) 
  6. print(greet(name, age)) 

這段代碼的一個歧義是,greet()理論上可以接受user和age的任何類型,并且可以返回任何類型。以下是我們如何使用類型提示消除歧義的方法:

  1. greeting = "Hello, {}, you're {} years old" 
  2. def greet(user:str, age:int) -> str: 
  3.     return greeting.format(user, age) 
  4. name = input("Your name?"
  5. age = int(input("How old are you?")) 
  6. print(greet(name, age)) 

給定greet()的這些類型提示, 當您在代碼中插入對greet()的調用時,編輯器可以提前告訴您接受哪些類型的greet()。

同樣,有時 Python 可以自動推斷函數返回的類型,但是如果對函數使用類型提示,最好是提示有關它的所有內容——它接受什么類型以及返回什么類型。

類型提示容器對象

如列表、字典和元組這樣的對象包含其他對象,所以我們需要鍵入類型提示來指示它們包含什么類型的對象。為此,我們需要求助于 Python 的typing(類型化)模塊,它提供了用于描述此類事物將持有的類型的工具。

  1. from typing import Dict, List 
  2. dict_of_users: Dict[int,str] = { 
  3.     1"Jerome"
  4.     2"Lewis" 
  5. list_of_users: List[str] = [ 
  6.     "Jerome""Lewis" 

字典由鍵和值組成,它們可以是不同的類型。您可以通過將字典作為列表提供給 來描述字典的類型typing.Dict。也可以通過向提供該類型來描述列表的對象類型typing.List。

OptionalUnion類型

某些對象可能包含兩種不同類型的對象之一。在這些情況下,可以使用Union或Optional。使用Union指示對象可以是多種類型之一,使用Optional指示對象是一種給定類型還是無。例如:

  1. from typing import Dict, Optional, Union 
  2. dict_of_users: Dict[int, Union[int,str]] = { 
  3.     1"Jerome"
  4.     2"Lewis"
  5.     332 
  6. user_id: Optional[int] 
  7. user_id = None # valid 
  8. user_id = 3 # also vald 
  9. user_id = "Hello" # not valid!  

在本例中,我們有一個以ints 作為鍵,但以ints strs 作為值的字典。user_id變量(我們可以用它來比較對字典的鍵)可以是一個intNone(“無有效用戶”),而不能是str

類型提示和類

要為類提供類型提示,只需引用與任何其他類型相同的名稱:

  1. from typing import Dict 
  2. class User: 
  3.     def __init__(self, name): 
  4.         self.name = name 
  5. users: Dict[int, User] = { 
  6.     1: User("Serdar"), 
  7.     2: User("Davis"
  8. def inspect_user(user:User) -> None
  9.     print (user.name) 
  10. user1 = users[1
  11. inspect_user(user1) 

請注意,inspect_user()的返回類型為None,因為它只是打印輸出而不返回任何內容。(此外,我們通常會將這樣的函數變成類的方法,但在本例中,將單獨對其進行說明。)

當對自定義對象使用類型提示時,我們有時需要為尚未定義的對象提供類型提示。在這種情況下,您可以使用字符串來提供對象名稱: 

  1. class User: 
  2.     def __init__(self, name:str, address:"Address"): 
  3.         self.name = name 
  4.         self.address = address 
  5.         # ^ because let's say for some reason we must have 
  6.         # an address for each user 
  7. class Address: 
  8.     def __init__(self, owner:User, address_line:str):         
  9.         self.owner = owner 
  10.         self.address_line = address_line 

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

 

責任編輯:梁菲 來源: InfoWorld
相關推薦

2022-10-09 07:07:51

Python類型代碼

2023-12-18 18:58:54

Python類型提示代碼

2010-07-01 16:41:33

PPPOE協議

2014-09-15 10:44:28

思科UCSUCS服務器

2014-09-15 10:15:32

UCS思科

2024-05-14 15:28:09

Python類型提示開發

2011-05-23 16:40:00

python

2011-08-03 09:20:30

Python

2011-06-01 16:31:23

枚舉

2009-06-25 14:20:01

Java枚舉類型

2023-10-30 18:05:55

Python類型

2016-12-27 15:23:56

vue.js雙向綁定操作

2009-10-10 09:52:32

2013-08-29 13:31:07

PostgreSQL數據庫數據庫日期

2011-11-24 21:05:44

ibmdw

2019-05-09 10:25:46

Python加密庫編程語言

2013-04-16 13:51:23

增強iOS應用程序性能

2010-02-04 14:43:41

分組交換網

2010-03-10 13:25:07

Python面向對象

2009-07-30 18:49:31

C#時間類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文字幕一区二区 | 亚洲va欧美va天堂v国产综合 | av一区二区三区在线观看 | 天天色官网 | 亚洲精品在线免费观看视频 | 久久久这里都是精品 | 在线观看午夜视频 | 久久久精品一区二区三区 | 久久精品国产亚洲 | 国精产品一区二区三区 | 国产在线精品一区二区三区 | 日本成人三级电影 | 中文字幕日韩一区 | 国产免费一区二区三区 | 精品乱码一区二区三四区视频 | 久久久久久国产精品 | 伊人伊人 | 自拍偷拍亚洲欧美 | 狠狠干av | 青青久久 | 91在线视频国产 | 国产av毛片 | 中文字幕第一页在线 | 国产精品自产拍 | 午夜精品视频 | 日本特黄特色aaa大片免费 | 精品毛片 | 中文av网站 | 亚洲另类自拍 | 日韩一二区 | 欧美精品在线一区二区三区 | 天天射天天干 | 亚洲精品免费观看 | 亚洲一区在线观看视频 | www.狠狠操 | 亚洲一区 中文字幕 | 成人免费网站在线 | 在线观看不卡av | www.一级毛片 | 激情黄色在线观看 | 国精日本亚洲欧州国产中文久久 |