2017-06-27 6 views
0

多くの日付を入力するように、ほとんどの場合、次のような関数を使用するスクリプトがあります。これらは、無効な日付形式を考慮する必要があります。Pythonで繰り返しtry-except文を縮約する

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ブロックは、達成しようとしているもの(つまり、どの変数を変更しているのか)が一意であるため、どのように役立つのかわかりません。私は本当にほんとうに良い構文がほしいと思っています。

+2

[codereview.se]はこれを尋ねるのに良い場所かもしれません。 –

+0

ああ、大丈夫です。私はそれをやります。 –

答えて

0

ふくそうを減らすために、関数で繰り返し呼び出しをラップしてみてください。ここに刺し傷があります:

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 
関連する問題