多くの日付を入力するように、ほとんどの場合、次のような関数を使用するスクリプトがあります。これらは、無効な日付形式を考慮する必要があります。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ブロックは、達成しようとしているもの(つまり、どの変数を変更しているのか)が一意であるため、どのように役立つのかわかりません。私は本当にほんとうに良い構文がほしいと思っています。
[codereview.se]はこれを尋ねるのに良い場所かもしれません。 –
ああ、大丈夫です。私はそれをやります。 –