假设我想编写一个比较排序函数,我可以提示输入必须是Sequence[T]
(在这种情况下为MutableSequence[T]
)的序列。
from typing import MutableSequence, T
def comparison_sort(s: MutableSequence[T]) -> None:
pass
然而,似乎没有一种开箱即用的方式暗示T
必须具有可比性。 (Comparable
中没有Ordered
或typing
或任何内容。)我如何实现这一目标?我想避免指定一组特定的类型,例如int
,float
,' str`,以便用户也可以提示他们自己的类型具有可比性。
答案 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要点。