在公共交通网络上使用站点和公共汽车/车辆的数据类

pybuses-entities的Python项目详细描述


pybus实体

作为公共交通系统项目的一部分使用的数据类,包括车站和公共汽车。

虽然pybus实体专注于总线,但它几乎可以与任何工作的公共交通系统一起使用 以类似的方式。

该项目依赖于两个基本类:

  • 停车:公共汽车停下来接送乘客的实际地点
  • 公共汽车:一种移动的车辆,有一定的停车路线并在那里停车

本项目主要为python vigobusapivigobus telegrabot开发。 两个协同工作的项目(第一个是中间api,第二个是telegram bot后端 使用来自那个api的数据)。 在这个公共交通系统中,公共汽车停在各站,每一站我们都能得到公共汽车的名单 在他们到达之前的剩余时间。

这些类的有趣之处在于,它们可以生成一个json输出,可以通过我们的api提供服务, 然后转换回我们客户机中的类实例。

要求

  • python=3.6
  • 侏儒

安装

pip install pybuses-entities

更改日志

  • 0.0.2
    • 添加选项以删除空列表&;实体的get_dict()方法上的空dict(默认为true)
    • 将"Source"字段添加到AdvancedStop和BuseResult
    • 为站点添加新的排序方法:按stopid排序,按距离排序
    • 添加/改进文档字符串
  • 0.0.1-初始版本

对象定义

stop和bus对象继承自pydantic。创建类的新实例时,其参数 必须以夸尔格的身份通过。 传递的额外Kwargs参数被忽略,因此这些类可以很好地将JSON用作输入和输出数据。

stop类和bus类都有两个从它们的基类继承的高级类级别,提供 更高级的属性。

可以以类似的方式创建自定义类,以满足每个特定项目的需要 以及公共交通系统,继承自这些基本类。

停止

属性

  • stopid:此停止的唯一标识符(必需,int)
  • 名称:此站的规范、可读名称,通常是其位置(必需,str)
  • 纬度经度:此站点的位置作为经纬度坐标(可选,浮点)
高级停止
  • 已创建:首次创建或注册此停止定义时(可选,datetime/str/int/float)
  • 已更新:上次更新此停止定义时(可选,datetime/str/int/float)1
  • 原始名称:当停止名称从外部数据源提取并由我们更改时, 我们可以将其原始名称保留在此属性上(可选,str)1
  • 标记:此站点的额外标记(可选,str列表)
  • 附加名称:此站点的可选附加名称,例如原始名称的翻译或 用户常用的替代名称(可选,str列表)
  • 距离:从该站点到某个点的距离。例如,当给出 在某个位置附近有哪些站点(可选,浮动)
  • :从中提取数据的数据源的名称(可选,str)

1时间戳可以是:datetime对象、str表示或int/float epoch时间戳

示例

经典对象声明:

frompybusentimportStopstop_1=Stop(stopid=1,name="The Red Keep")stop_6960=Stop(stopid=6960,name="Praza do Rei",lat=42.235056274709,lon=-8.72675751435639)

json/kwargs声明(高级停止示例):

frompybusentimportAdvancedStopstop_data={"stopid":6660,"name":"Porta do Sol","lat":42.2379152928961,"lon":-8.72484658707515,"created":1529137067,"updated":1560673067,"original_name":"Porta Do Sol, s/n",# 1"tags":["center","centre""zentrum","center","casco viejo","old town"],# 2"extra_names":["puerta del sol","sun gate"],# 3"distance":25.38}stop=AdvancedStop(**stop_data)

1原始名称可以是提供停止信息的原始数据源给出的名称, 我们换成了更好看的格式

2由于该站位于市中心,我们使用了"中心"、"中心"等标签; 它也靠近老城区,因此使用了"老城区"之类的标记

"太阳门"到底是什么意思?西班牙语"puerta del sol"的直译, 不要在生产中做这些无用的翻译吗?)

总线

属性

  • busid:此总线的唯一标识符(可选,str)-如果未提供,则自动生成busid 作为线路和线路的MD5和
  • 线路:总线线路(必需,str)
  • 路线:公交路线(必选,str)
  • 时间:巴士到达某一站的剩余时间(可选,int/float/datetime/timedelta)1
高级总线
  • 到达:巴士何时到达某一站(可选,int/float/datetime/timedelta)12
  • 发车:巴士何时从某一站发车(可选,int/float/datetime/timedelta)12
  • 站点:本车将停靠的站点列表(可选,站点对象列表)

1巴士剩余/到达/离开时间可以指定为相对时间 (从现在开始到到达/离开的时间)或绝对时间(datetime对象或int/float epoch时间戳)。 相对时间可以设置为int、float或timedelta,具体取决于表示该时间的方式。

2当运输系统区分到港和离港(例如许多列车网络)时, 使用AdvancedBus到达时间而不是时间

示例

经典对象声明:

fromdatetimeimportdatetimefrompybusentimportBus# Bus 15C (Mohawk Avenue - Bunker Hill Street) will arrive in 5 minutesbus=Bus(line="15C",route="Mohawk Avenue - Bunker Hill Street",time=5)# Bus 21 (Algonquin) will arrive in 1 minute and 30 secondsbus=Bus(line=21,route="Algonquin",time=timedelta(minutes=1,seconds=30))print(type(bus.line))# Line is casted to string although declared as int# Bus 5B (Dukes - Bohan) will arrive at 14h52# Creating a datetime object can be a bit more tricky since it requires the date# Get today date and replace time with the arrival timedt=datetime.now().replace(hour=14,minute=52,second=0,microsecond=0)bus=Bus(line="5B",route="Dukes - Bohan",time=dt)# It can be easier if your data source provides an epoch timestampepoch=1529137067dt=datetime.fromtimestamp(epoch)bus=Bus(line="5B",route="Dukes - Bohan",time=dt)

json/kwargs声明(advancedbus示例):

frompybusentimportAdvancedBusbus_data={"line":5,"route":"Middle Park - East Holland","arrival":5,"departure":7}bus=AdvancedBus(**bus_data)

静态总线声明及其停止路径(AdvancedBus示例):

frompybusentimportAdvancedBus# Define the route of the buses Line 5, Route 'Middle Park - East Holland'bus=AdvancedBus(line="5",route="Middle Park - East Holland",stops=[Stop(stopid=1231,name="Middle Park East"),Stop(stopid=1232,name="Middle Park West"),Stop(stopid=1233,name="Lancaster Avenue"),Stop(stopid=1234,name="East Holland South"),Stop(stopid=1235,name="East Holland North")])

总线结果

当我们想要返回一个更加上下文化的总线列表时,使用这个类。buseResult不从总线继承。 以下字段可用于为总线结果提供上下文:

属性

  • 总线:返回的总线列表
  • 更多可用总线:如果数据源报告有更多可用总线,则可以设置布尔值, 但我们只获取前n个结果-例如,因为数据源被拆分为多个页面(可选,bool)
  • 停止:当数据源在其实时总线列表旁边返回停止信息时,我们可以返回它(可选,停止)
  • :从中提取数据的数据源的名称(可选,str)

示例

frompybusentimportBusesResultresult=BusesResult(buses=[Bus(line="5",route="Middle Park - East Holland",time=3),Bus(line="15C",route="Dukes - Bohan",time=9),Bus(line="5",route="Middle Park - East Holland",time=48),],stop=Stop(stopid=12812,name="Middle Park (Entrance)"),more_buses_available=True)

自定义类

可以继承stop、advancedstop、bus和advancedbus来创建具有新属性的自定义类 或更改基本属性。

如果不是专门为支持不同的数据类型而设计,那么涉及某些逻辑的属性可能会有问题 或者在设计为需要时是可选的。

例如,您可以跳过总线上的线路或路由,站点ID仍将自动生成,因为这种情况 被考虑过。 如果不是,则不可能在没有线路/路由的情况下实例化总线,因为这两个方法都是按顺序需要的 生成停止ID。

示例

"我的总线网络没有行号,只有路由-我将创建一个没有行号的自定义总线类 (更像是,该行不是必需的)"

frompybusentimportBusclassMyBus(Bus):line:Optional[str]

"在我的公交网络中,公交车有一个标志,可以知道他们是否为行动不便的乘客提供了特殊的座位 (默认为false)"

frompybusentimportBusclassMyBus(Bus):reduced_mobility:bool=False

"在我的公交网络上,站牌上有字母,所以必须成为一个字符串"

pip install pybuses-entities
0

例外情况

定义了一组基于站点和总线的异常。它们不包含逻辑。

  • pybussexception:所有自定义异常的基异常(继承基异常)
    • stopException:所有与停止相关的异常的基本异常
      • stopNotFound:在某个数据源上未找到停止,但该数据源无法 确认物理上不存在停止。例如,如果我们在本地存储站点,但找不到站点 在它上面,可能是它没有保存在那里,但它可能实际存在。
      • stopNotExist:在确定停止不实际存在时引发。例如,如果我们要求远程API 一个停止,API会回复它不存在。
    • 总线异常:所有总线相关异常的基本异常

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我想访问同一类的不同函数中的函数变量   创建字段/值哈希映射的java反射   java Velocity工具向后兼容性?   cmd JAVA运行时错误:发生JNI错误   java spring引导示例hateoas不工作   java为什么Android Studio和gradle可以使用不同的类路径进行单元测试?   java Selenium Firefox驱动程序初始化   java如何在jar中重新定位gradle依赖项的包   java为什么我的单线程hello world应用程序使用22个OS线程?   正则表达式替换Java字符串中的特殊字符   在任何派生类的构造函数之后运行方法的java   java从输入字符串中找出日期   带有libGdx(Java)音乐的安卓studio可以在Android模拟器上工作,但不能在桌面上工作   java我在getconnection的参数方面有错误吗?   java使用JFileChooser访问选定文件   java如何将Json解析为另一个活动   java使用Resources for html和rest server   java更新列表,列表内容来自循环中的方法   java如何在GLSL中读取完整范围的32位整数纹理