【问题标题】:Condensing repetitive try-except statements in python在python中压缩重复的try-except语句
【发布时间】:2017-11-30 19:37:57
【问题描述】:

我有一个脚本要求用户输入很多日期,主要是在类似于下面的函数中。这些需要考虑无效的日期格式:

import numpy as np
import pandas as pd
import xlwings as xw
import datetime as dtt

def week_init():
        """Creates an initial week datetime and determines what the checking cutoff
        'beforeday' to be used in Stage 2 is."""
        week = input('Week to check: MM/DD/YYYY\n')
        switch = 1
        while switch == 1:
            try:
                week = dtt.datetime.strptime(week,'%m/%d/%Y') #turns input to a datetime
                switch = 0
            except ValueError:
                week = input('Unrecognized date format, please try again: MM/DD/YYYY\n')
        beforeday = (input('Check days before date (Press enter to use today): MM/DD/YYYY\n')
            or dtt.date.today())
        if (beforeday != dtt.date.today()):
            switch = 1
            while switch == 1:
                try:
                    beforeday = dtt.datetime.strptime(beforeday,'%m/%d/%Y')
                    switch = 0
                except ValueError:
                    beforeday = input('Unrecognized date format, please try again: MM/DD/YYYY\n')
        return week, beforeday

还有一些函数可以检查给定日期的索引,并且必须处理与任何索引都不匹配的给定日期:

def spotmap(week, bam, pt):
    """Maps the pivoted data for the chosen week to the BAM dataframe's SD column."""
    print('Mapping data to BAM... ',end=''),
    switch = 1
    while switch == 1:
        try:
            bam['SD'] = bam.index.to_series().map(pt.fillna(0)['len',week])
            switch = 0
        except KeyError:
            print('Invalid date, please try again.')
            week = input('Week start date (Sunday): MM/DD/YYYY\n')
    print('Done')
    return bam

由于脚本在获取这些日期后有很多事情要做,所以我不希望它在出现问题时崩溃,但是如果没有正确的日期输入它就无法继续,所以我目前让它循环使用那些“切换”变量控制何时愿意在有效日期继续前进。但是,正如您所看到的,这些 try/except 块正在迅速使原本简单的代码膨胀。有没有办法凝聚这些东西?还有,比开关更好的方法吗?

Repetitive Try and Except Clauses

这里的答案建议使用装饰器,但据我从文档和页面(如this)可以看出,这些是用于包装函数,而不是用于替换内部代码块。此外,我不确定它们会有多大用处,因为 try/except 块在它们试图完成的任务中大多是独一无二的(即,它们正在更改哪个变量)。我想我真的只是希望有更好的语法。

【问题讨论】:

  • Code Review 可能是一个更好的地方问这个问题,我想。
  • 啊,好的。那我就这么做吧。

标签: python while-loop try-except


【解决方案1】:

尝试在函数中结束重复调用以减少臃肿。试一试:

import numpy as np
import pandas as pd
import xlwings as xw
import datetime as dtt

def loop_until_good(func, arg):
    looping = True
    while looping:
        (arg, looping) = func(arg)
        return arg

def make_datetime(date):
    try:
        date = dtt.datetime.strptime(date,'%m/%d/%Y') #turns input to a datetime
        return date, False
    except ValueError:
        date = input('Unrecognized date format, please try again: MM/DD/YYYY\n')
        return date, True

def bammit(arg):
    (bam, week, pt) = arg
    try:
        bam['SD'] = bam.index.to_series().map(pt.fillna(0)['len',week])
        return (bam, week, pt), False
    except KeyError:
        print('Invalid date, please try again.')
        week = input('Week start date (Sunday): MM/DD/YYYY\n')
        return (bam, week, pt), True

def week_init():
        """Creates an initial week datetime and determines what the checking cutoff
        'beforeday' to be used in Stage 2 is."""
        week = str(input('Week to check: MM/DD/YYYY\n'))
        print type(week)
        print week
        loop_until_good(make_datetime, week)
        beforeday = (input('Check days before date (Press enter to use today): MM/DD/YYYY\n')
            or dtt.date.today())
        if (beforeday != dtt.date.today()):
            loop_until_good(make_datetime, beforeday)
        return week, beforeday

def spotmap(week, bam, pt):
    """Maps the pivoted data for the chosen week to the BAM dataframe's SD column."""
    print('Mapping data to BAM... ')
    loop_until_good(bammit, (bam, week, pt))
    print('Done')
    return bam

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 2013-04-10
    • 2018-03-13
    • 1970-01-01
    • 2011-09-29
    • 2018-06-18
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多