Python 组织代码有困难--我应该使用类还是只使用函数?相同的文件还是不同的文件?
我正在构建一个小应用程序,它生成要发送到数据库的指标,我很难思考如何组织它,使其a)更可读,b)更简洁。大部分功能的代码都已经编写好了 应用程序最终需要从用户处获取输入,以运行以下各项中的哪一项: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编写度量 写入卡夫卡(卡夫卡制作人)或直接写入数据库 在决策过程中,每个要点中的每个选项都可以与其他选
- 以3种不同格式生成指标
- 在5种不同的度量用例中生成所选的格式(基本上是哪种类型的度量,而不是格式;即appmetrics、服务器度量、日志、财务数据等)。这些选项中应该有5个
- 通过HTTP或UDP编写度量
- 写入卡夫卡(卡夫卡制作人)或直接写入数据库
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问题来说似乎不太合适)。也就是说,你的答案与我所寻找的完全一致!你能详细解释一下“查找表”是什么意思吗?我在想一本字典,它可以将配置选项映射到管道函数