缩短if,elif,elif else克劳斯

2024-09-26 22:42:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个程序,检查下一班火车什么时候开。为此,它从网站获取出发时间,并将其存储在数组中(times\luz和times\hitz)。你知道吗

但是,API有时没有任何信息,因此数组中没有数据,这在代码的后面会导致错误,因此我认为这是一个好主意:

if times_hitz and times_luz:
   Code to be executed if both contain values

elif times_luz:
   Code to be executed if only times_luz contains values

elif times_hitz:
   Code to be executed if only times_hitz contains values

else 
   print("No content available")
   sys.exit()

这在技术上是可行的,但是代码目前大约有30行长,所以我必须复制和粘贴代码2次,只做一些细微的更改。这将导致大约80行代码,看起来相当难看。有没有更好的办法?你知道吗

编辑:

我在猜测文件大小时犯了一个巨大的错误,它实际上有103行长,包括注释。因此,我决定上传到谷歌硬盘:

https://drive.google.com/open?id=1F5FIuAy_g7sC_2wTprqg3EF_m_JXEreL

数组中没有数据时发生的错误在第44行和第48行,因为数组中的第一项times_luz/hitz不存在,因此无法保存到变量中。这意味着我必须执行一些代码,如果times\u hitz中没有任何内容,则只检查\u luz列车,反之亦然。如果两者都包含数据,我想执行google驱动器上的代码,如果两者都不包含数据,它应该打印一条错误消息。你知道吗

卢兹和希茨的终点代表卢塞恩和希茨基奇,这是火车在我的车站可以走的两条路

这段代码基本上从一个trainapi获取时间,并将它们存储在3个不同的变量中。然后它检查这3次,并将下一次离开的数据存储在一个变量中。它是为卢兹和希茨做的。最后,它检查哪趟列车(luz或hitz)提前发车,并打印两者之间的差异日期时间.now还有火车的发车时间

抱歉,如果我的解释不清楚,请随时在评论中提出更多问题


Tags: to数据代码if错误时间code数组
2条回答

your code中有大量的重复。基本上,对于两个目的地(以及以后可能添加的任何其他目的地),获取下一列火车的整个代码是相同的,应该移动到一个函数中。你知道吗

def get_next_train(params):
    res =requests.get(base, params=params)
    parsed_json = res.json()

    #Zeiten aus parsed_json extrahieren
    time_strings = [d["from"]["prognosis"]["departure"]
        for d in parsed_json["connections"]]

    #String, um Zeiten in time_strings nach ISO 8601 zu parsen
    iso_format = "%Y-%m-%dT%H:%M:%S%z"

    # Time Strings zu datetime Objekten konvertieren
    times = [datetime.strptime(ts, iso_format) 
        for ts in time_strings if ts is not None]

    # Checken, ob times leer sind
    if not times:
        return None # CHANGE: return None if no times found

    #Zeitzone der ersten zeit in Times speichern
    tz = times[0].tzinfo

    #jetztige Zeit mit Zeitzone tz, Mikrosekunden löschen
    nowtime = datetime.now(tz).replace(microsecond=0)

    # Checken, ob Time_1 noch in der Zukunft ist. Wenn ja, diese Zeit als Time_luz speichern
    time = min(t for t in times[0:3] if t > nowtime) # CHANGE: use min
    return time, time - nowtime

然后,您可以获得两个目的地的结果,并在filter之后获得min结果,即None,然后只需检查该min是否为None(默认值)。你知道吗

res_luz = get_next_train(params_luz)
res_hitz = get_next_train(params_hitz)
res = min(filter(None, (res_luz, res_hitz)), default=None)
if res is not None:
    time, diff = res
    print ("Next train", time, ", in", str(diff))
else:
    print("Service nicht verfügbar")

更新:似乎是傍晚时分,nowtime之后可能没有列车发车,导致min引发异常。您可以通过如下提供另一个default并在本例中返回None来解决这个问题。你知道吗

time = min((t for t in times if t > nowtime), default=None)
return (time, time - nowtime) if time is not None else None

更新:如果你想知道下一列火车的目的地(有意义的…),你可以从参数中得到它,并返回它与时间和差异

    return time, time - nowtime, params["to"]

然后打开包装并打印:

if res is not None:
    time, diff, dest = res
    print ("Next train to %s at %s (in %s)" % (dest, time, diff))

您可以改为使用Python进行定义,因此只需定义一次。如果你需要再次使用这个定义,你可以简单地称之为。一旦这个函数变得更复杂,你也可以把它变成一个类。你知道吗

您的代码将改为:

def train_time(times_hitz, time_luz):
    if times_hitz and times_luz:
        Code to be executed if both contain values

    elif times_luz:
        Code to be executed if only times_luz contains values

    elif times_hitz:
        Code to be executed if only times_hitz contains values

    else:
         print("No content available")
         sys.exit()

    return leave

其中“离开”将从您执行的代码来确定下一列火车何时离开。当你需要评估火车是否要开走时,只需:

leave = train_time(times_hitz, time_luz)

相关问题 更多 >

    热门问题