使用 argparse 选项重构

如何解决使用 argparse 选项重构

试图清理它,让时间作为参数通过 argparse 而不是 sys。这个想法是将时间参数作为输入并再次搜索存储桶,转换它们并返回匹配项。它适用于 sys.argv 值,但这显然是有限的。尝试使用 argparse 选项进行重构。

你会看到

start_time = sys.argv[3] end_time = sys.argv[5] 硬编码

import argparse
import logging
import os
import sys
import re
import time

"""take CLI parameters and search against bucket,converts them and return matching dirs"""

FILE = 'bucket'
TIME_FORMAT = "%m-%d-%Y-%H:%M:%s"

def get_file():
    """Get to dir,fetch resources"""
    s3 = resource('s3')
    bucket = s3.Bucket(FILE)
    index = sys.argv[2]
    objects = bucket.objects.filter(Prefix=index)
    return objects


def convert_index():
    """conversion of the epoch filenames output
    """
    dir_files = get_file()
    for file in dir_files:
        output = file.key       # file is a class type
        if 'db_' in output:
            output_dir = output.split('/') 
            times = output_dir              # [1] is index name only
            start_time = sys.argv[3]
            end_time = sys.argv[5]
            fields = times[2].split('_')
            try:
                start = convert_epoch(fields[1])     # first time field
                end = convert_epoch(fields[2])       # second time field
                if start.startswith(start_time) or end.startswith(start_time) == start_time:
                    print("{}\t\t is {}_{}".format(output,start,end))
                    logging.basicConfig(level=logging.INFO,filename='logfile.log',format='%(asctime)s - \
                                                                                           %(levelname)s - %(message)s')
                elif end.startswith(end_time) or end.startswith(end_time) == end_time:
                    print("{}\t\t\t is {}_{}".format(output,end))
            except ValueError as ve:
                    logging.info("did not convert due to {}".format(ve))



def convert_epoch(input_epoch):
    """takes epoch value and converts to human readable
   time.strftime("%m-%d-%Y_%H-%M-%s",time.localtime(1442530758))
   '09-17-2019_15-59-18'
   """
    converted_epoch_value = time.strftime(TIME_FORMAT,time.localtime(int(input_epoch)))
    return converted_epoch_value


def main():
    parser: ArgumentParser = argparse.ArgumentParser(
      description="""Supply the directory you want to search files for. Give earliest and latest time to query bucket for
         usage: format_files.py [-h] [-e --earliest] [-l --latest]""")
    parser.add_argument('-i','--index',required=False,help='index name directory to query for ex:\n'
                                                              'format_files.py -i folder/folder')
    parser.add_argument('-s','--start_time',help='queries from start time (not necessarily earliest time)')
    parser.add_argument('-e','--end_time',help='queries data until end time (not necessarily latest time)')
    args = parser.parse_args()

    if len(sys.argv) < 2:
        sys.exit(parser.description)

    if args.index:
        convert_index()


if __name__ == "__main__":
    main()

在 if start.startswith(start_time) 或 end.startswith(start_time) == start_time 中遇到问题: 尝试传入 argparse 选项时的行

感谢任何见解

解决方法

为了向您展示一个简单的概念证明,我删除了很多复杂的代码:

import argparse

def convert_index(args):
    start_time = args.start_time
    end_time = args.end_time

    start = '09-17-2015_15-59-18'
    end = '12-01-2019_15-59-18'
    if start.startswith(start_time) or end.startswith(start_time) == start_time:
        print('starts with start_time')
    elif end.startswith(end_time) or end.startswith(end_time) == end_time:
        print('starts with end_time')

def main():
    parser: ArgumentParser = argparse.ArgumentParser()
    parser.add_argument('-s','--start_time',required=False,help='queries from start time (not necessarily earliest time)')
    parser.add_argument('-e','--end_time',help='queries data until end time (not necessarily latest time)')
    args = parser.parse_args()

    convert_index(args)

if __name__ == "__main__":
    main()

->

$ python3 test.py  -s 09-17-2015 -e 12-01-2019
starts with start_time

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?