我怎么能暗示某种类型与打字相似

时间:2016-06-07 01:38:20

标签: python python-3.x

假设我想编写一个比较排序函数,我可以提示输入必须是Sequence[T](在这种情况下为MutableSequence[T])的序列。

from typing import MutableSequence, T

def comparison_sort(s: MutableSequence[T]) -> None:
    pass

然而,似乎没有一种开箱即用的方式暗示T必须具有可比性。 (Comparable中没有Orderedtyping或任何内容。)我如何实现这一目标?我想避免指定一组特定的类型,例如intfloat,' str`,以便用户也可以提示他们自己的类型具有可比性。

2 个答案:

答案 0 :(得分:2)

如评论中所述,Comparable不是存在状态,它仅作为一对类型的描述符有意义。通常,排序函数正在使用同类型,因此只要您不介意类型检查器仅处理“支持<某些类型”的概念而不是“支持<”任意类型“,您可以定义自己的Comparable并使用它绑定typing TypeVar。方便的是,PEP484(定义{{​​1}}提示)已提供an example of how you'd do this

typing

然后,您可以将此用于from abc import ABCMeta from typing import Any, TypeVar class Comparable(metaclass=ABCMeta): @abstractmethod def __lt__(self, other: Any) -> bool: ... CT = TypeVar('CT', bound=Comparable) 定义:

comparable_sort

请注意,我只需要定义def comparable_sort(s: MutableSequence[CT]) -> None: ;作为一项规则,Python完全按照__lt__实现自己的排序函数(它不使用任何其他丰富的比较运算符,甚至不使用__lt__),所以设计你的是一个好主意自己的算法也是一样的,所以任何__eq__都可以处理,你可以用同样的方式处理。

答案 1 :(得分:1)

此版本适用于当前的python -m pip install --upgrade pip 版本。

基于import socket import uuid import os import re HNAME=1 IP=2 MAC=3 ARP=4 ROUT=5 QUIT=6 def get_user_choice(): print("Network Toolkit Menu") print("_____________________________________") print("1. Display the Host Name") print("2. Display the IP Address") print("3. Display the MAC Address") print("4. Display the ARP Table") print("5. Display the Routing Table") print("6. Quit") print() choice = int(input("Enter your choice: ")) return choice def choicefun(choice): while choice > QUIT or choice < HNAME: choice = int(input("Please enter a valid number: ")) print() return choice def get_hostname(host): host=socket.gethostname() print("\n The host name is: ", host) #return host def get_ipaddr(ipv4): ipv4=socket.gethostbyname() print("\n The IPv4 address of the system is: ", ipv4) #return ipv4 def get_mac(ele): print ("The MAC address is : ", end="") print (':'.join(['{:02x}'.format((uuid.getnode() >> ele) & 0xff) for ele in range(0,8*6,8)][::-1])) def get_arp(line): print("ARP Table") with os.popen('arp -a') as f: data=f.read() for line in re.findall('([-.0-9]+)\s+([-0-9a-f]{17})\s+(\w+)',data): print(line) return line def __pyroute2_get_host_by_ip(ip): print("Routing table\n: ") table=os.popen('route table') print(table) def main(): counter=False while counter==False: choice = get_user_choice() choicefun(choice) if str(choice) == "6": counter==True elif str(choice) == "1": get_hostname() elif str(choice) == "2": get_ipaddr() elif str(choice) == "3": get_mac() elif str(choice)== "4": get_arp() elif str(choice) == "5": __pyroute2_get_host_by_ip() main() 回购中的线程:https://github.com/python/typing/issues/59

mypy

link到Github要点。