2014-01-28 54 views
1

我想要有效的用戶輸入。我有不止一種類型的有效日期和一個只是空白的。可能有一個簡單的方法來檢查這一點,但我無法弄清楚。蟒蛇驗證日期格式或空白

def check_input(i): 
    valids = ['%Y-%m-%d', '%Y%M', ''] 
    while True: 
     try: 
      date = strptime(i, valids) 
     except ValueError as e: 
      print 'Could not parse: {}'. format(e) 
     else: 
      return True 

我不認爲我可以將列表傳遞給strptime對象。它返回TypeError:不可用類型:'list'。

這裏是腳本

def parse_arguments(): 
    parser = argparse.ArgumentParser(description='API Statistics') 
    parser.add_argument('-c', '--company', help='Company name') 
    parser.add_argument('-d', '--download', help='Download file', action='store_true') 
    return parser.parse_args() 

def list_cmds(company): 
    for num, cmd in enumerate(company._cmds): 
     print '{}: {}'.format(num, cmd) 

def get_cmd_dict(company): 
    return dict(enumerate(company._cmds)) 

def run_cmd(i, cmd, **kwargs): 
    return getattr(i, get_cmd_dict(i)[int(cmd)])(**kwargs) 

def writer(data, file): 
    with open(file, 'w') as f: 
     f.write(data) 

def get_func_args(f): 
    ins = inspect.getargspec(f).args 
    ins.remove('self') 
    return ins 

def check_input(i): 
    valids = ['%Y-%m-%d', '%Y%M', ''] 
    while True: 
     try: 
      date = strptime(i, valids) 
     except ValueError as e: 
      print 'Could not parse: {}'. format(e) 
     else: 
      return True 

def main(): 
    args = parse_arguments() 

    if args.company == 'parklogic': 
     i = PlAPI(11111, 'asdf', 'program', debug=False) 
     pl_cmds = get_cmd_dict(i) 


     print 'please select a command' 
     print '-----------------------' 

     list_cmds(PlAPI) 

     user_cmd = raw_input('Number: ') 
     print '' 

     cmd_args = get_func_args(getattr(i, pl_cmds[int(user_cmd)])) 
     users_args = {} 
     format_mapper = {0: 'YYYY-MM-DD', 
         1: 'YYYY-MM-DD', 
         2: 'YYYY-MM-DD', 
         3: 'YYYY-MM-DD', 
         4: 'YYYYMM', 
         5: 'YYYY-MM-DD', 
         6: 'YYYY-MM-DD HH:mm:ss', 
         7: 'YYYY-MM-DD', 
         8: 'YYYY-MM-DD'} 

     for arg in cmd_args: 
      user_input = raw_input('Enter {} as {} or leave blank: '.format(
              arg, format_mapper[int(user_cmd)])) 
      if check_input(user_input): 
       users_args[arg] = user_input 

     resp = run_cmd(i, user_cmd, **users_args) 

     if args.download: 
      writer(resp.read(), '{}.csv'.format(pl_cmds[int(user_cmd)])) 
     else: 
      print resp.read() 

    if __name__ == '__main__': 
     main() 

回答

1
def check_input(i): 
    valids = ['%Y-%m-%d', '%Y%M', ''] 
    for valid in valids 
     try: 
      return strptime(i, valid) 
     except ValueError as e: 
      pass 
    return False 
+0

的片斷當我嘗試這一點,並輸入無效的日期格式,在我valid_list沒有上市,我沒有得到任何ValueErrors。 – Ptrkcon

+0

我忘了s有效,是嗎?否則,你應該多解釋一下。 – MatthieuBizien

+0

我發現你的錯字,不用擔心:)我想我需要在我的主函數中做一個True循環,所以如果在check_input中引發異常,它會再次提示輸入。那有意義嗎? – Ptrkcon