Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组织代码有困难--我应该使用类还是只使用函数?相同的文件还是不同的文件?_Python_Python 3.x_Design Patterns_Organization_Code Organization - Fatal编程技术网

Python 组织代码有困难--我应该使用类还是只使用函数?相同的文件还是不同的文件?

Python 组织代码有困难--我应该使用类还是只使用函数?相同的文件还是不同的文件?,python,python-3.x,design-patterns,organization,code-organization,Python,Python 3.x,Design Patterns,Organization,Code Organization,我正在构建一个小应用程序,它生成要发送到数据库的指标,我很难思考如何组织它,使其a)更可读,b)更简洁。大部分功能的代码都已经编写好了 应用程序最终需要从用户处获取输入,以运行以下各项中的哪一项: 以3种不同格式生成指标 在5种不同的度量用例中生成所选的格式(基本上是哪种类型的度量,而不是格式;即appmetrics、服务器度量、日志、财务数据等)。这些选项中应该有5个 通过HTTP或UDP编写度量 写入卡夫卡(卡夫卡制作人)或直接写入数据库 在决策过程中,每个要点中的每个选项都可以与其他选

我正在构建一个小应用程序,它生成要发送到数据库的指标,我很难思考如何组织它,使其a)更可读,b)更简洁。大部分功能的代码都已经编写好了

应用程序最终需要从用户处获取输入,以运行以下各项中的哪一项:

  • 以3种不同格式生成指标
  • 在5种不同的度量用例中生成所选的格式(基本上是哪种类型的度量,而不是格式;即appmetrics、服务器度量、日志、财务数据等)。这些选项中应该有5个
  • 通过HTTP或UDP编写度量
  • 写入卡夫卡(卡夫卡制作人)或直接写入数据库
在决策过程中,每个要点中的每个选项都可以与其他选项一起选择,因此可能的度量生成选项的总排列为3*5*2*2=60。 我组织起来有困难的原因是我要写的大多数函数都有类似的结构,但我不想写60次小的变化。这看起来很混乱,而且是一种糟糕的做法,不是吗

我想我会用一个配置文件来收集用户输入(这个文件的用户会理解配置文件),但是我需要找到一种方法来动态地将这些值注入到程序中,这样我就不必重复那么多代码

我很确定这是做所有的时间,但我是新的,所以任何帮助将不胜感激

如果适用,下面是一些示例代码,举例说明了这个问题。还请注意,用户还可以指定一些函数参数(
batch\u size
num\u batches
interval
,等等),我不认为这些参数是函数的一部分,必要时:

bucket = "default"
org = "org"
token = os.environ['TOKEN']

regions = ['us-west-1','us-west2','us-east-1','us-east-2','ap-southeast-2','eu-west-1']
apps = ['checkout','shoes','payment','frontend',]
user_sessions = range(5,2000,45)
num_xactions = range(0,11)

def influx_metric_gen(batch_size=5, num_batches=100, interval=5, use_case='biz_intel', write_once=False): 

    url = "http://localhost:9999"
    client = InfluxDBClient(url=url, token=token, org=org, debug=True)
    write_api = client.write_api(write_options=SYNCHRONOUS)

    if use_case == 'biz_intel':
        # write biz_intel metrics
        apps = ['checkout','shoes','payment','frontend']
        user_sessions = range(5,2000,45)
        num_xactions = range(0,11)

        if write_once:
            # writes one batch
            points = []
            for x in range(0,batch_size):
                points.append(Point("biz_intel").tag("region", random.choice(regions)) \
                                    .tag("app",random.choice(apps)) \
                                    .field("user_sessions", random.choice(user_sessions)) \
                                    .field("num_transactions",random.choice(num_xactions)) \
                                    .time(time.time_ns()))
            write_api.write(bucket=bucket, org=org, record=points)
        else:
            # generates num_batches of batches   
            for i in range(0,num_batches):
                points = []
                #local = time.localtime()
                for x in range(0,batch_size):
                    points.append(Point("biz_intel").tag("region", random.choice(regions)) \
                                        .tag("app",random.choice(apps)) \
                                        .field("user_sessions", random.choice(user_sessions)) \
                                        .field("num_transactions",random.choice(num_xactions)) \
                                        .time(time.time_ns()))
                write_api.write(bucket=bucket, org=org, record=points)
                sleep(interval)


    elif use_case == 'devops':
        # write devops metrics
        host_prefixes = ['a','b','c','d']
        host_suffixes = range(0,5)
        host = random.choice(host_prefixes) + str(random.choice(host_suffixes))

        # More to add here (not relevant for question)



def graphite_metric_gen(batch_size=5, num_batches=100, interval=5, use_case='biz_intel', write_once=False): 

    if use_case == 'biz_intel':

        apps = ['checkout','shoes','payment','frontend']
        user_sessions = range(5,2000,45)
        num_xactions = range(0,11)       

        if write_once:
            for x in range(0,batch_size):
                points.append(f"biz_intel.{random.choice(regions)}.{random.choice(apps)}.user_sessions {random.choice(user_sessions)} {time.time_ns()}")
                points.append(f"biz_intel.{random.choice(regions)}.{random.choice(apps)}.num_transactions {random.choice(num_xactions)} {time.time_ns()}")
            write_api.write(bucket=bucket, org=org, record=points)
        else:       
            for i in range(0,num_batches):
                points = []
                #local = time.localtime()
                for x in range(0,batch_size):
                    points.append(f"biz_intel.{random.choice(regions)}.{random.choice(apps)}.user_sessions {random.choice(user_sessions)} {time.time_ns()}")
                    points.append(f"biz_intel.{random.choice(regions)}.{random.choice(apps)}.num_transactions {random.choice(num_xactions)} {time.time_ns()}")
                write_api.write(bucket=bucket, org=org, record=points)
                sleep(interval)

            # More to add here (not relevant for question)
    ```

这太广泛了,无法回答,但在较高的层次上,您有一个数据生成管道(?(3种类型)|数据选择(5种类型)|数据传输(2种类型)|数据写入(2种类型)。与其写3*5*2*2个不同的函数,不如写3+5+2+2个函数,并确保每种类型的函数的输出都可以被管道中的下一种类型的函数使用。创建查找表,以便用户的配置选择可以映射到函数,然后您可以动态构建管道。是的,我意识到这是一个广泛的问题。如果不向您展示所编写的所有代码,就很难做到概括性(对于我来说,这对于StackOverflow问题来说似乎不太合适)。也就是说,你的答案与我所寻找的完全一致!你能详细解释一下“查找表”是什么意思吗?我在想一本字典,它可以将配置选项映射到管道函数