gpt4 book ai didi

python - len 函数未按预期运行

转载 作者:行者123 更新时间:2023-12-05 03:23:19 25 4
gpt4 key购买 nike

我正在构建一个函数,该函数根据传入的标签字典将附加标签应用于 aws 实例。

预期行为:当传入多个 TEST_CUSTOMER_ID 时,该函数应返回以下标签字典:

{'foo': 'bar', 'Account': 'shared'}

单元测试函数的当前行为仅返回:

{'foo': 'bar', 'Account': [['test_customer_id1', 'test_customer_id2']]} 

我该如何解决这个问题?

def get_acct_value(tags, customer_id, ceid):
customer_id = [customer_id]

if "Account" in tags:
if tags["Account"] == customer_id:
pass
else:
if len(customer_id) > 1:
tags["Account"] = "shared"
elif len(customer_id) == 1:
tags["Account"] = customer_id
else:
raise exceptions.CustomerNotFoundError(f"No customer(s) found on {ceid}")
else:
if len(customer_id) > 1:
tags["Account"] = "shared"
elif len(customer_id) == 1:
tags["Account"] = customer_id
else:
raise exceptions.CustomerNotFoundError(f"No customer(s) found on {ceid}")
return tags

单元测试:

TAGS_NO_VALUE = {'foo': 'bar'}
TEST_CUSTOMER_ID_LIST = ["test_customer_id1", "test_customer_id2"]
TEST_CEID = "test_ceid"


def test_get_account_value_customer_list():
response = tagging.get_acct_value(TAGS_NO_VALUE, TEST_CUSTOMER_ID_LIST, TEST_CEID)

print(response)

其他单元测试:

所有三个测试都应返回:{'Account': customer_id, 'foo': 'bar'}

TEST_CUSTOMER_ID = "test_customer_id"
TAGS_UNEXPECTED_VALUE = {'Account': '', 'foo': 'bar'}
TAGS_EXPECTED_VALUE = {'Account': customer_id, 'foo': 'bar'}

def test_get_acct_value_no_value():

response = tagging.get_acct_value(TAGS_NO_VALUE,
TEST_CUSTOMER_ID, TEST_CEID)

print(response)


def test_get_acct_value_unexpected_value():

response = tagging.get_acct_value(TAGS_UNEXPECTED_VALUE, TEST_CUSTOMER_ID, TEST_CEID)

print(response)

def test_get_acct_value_expected_value():

response = tagging.get_acct_value(TAGS_EXPECTED_VALUE, TEST_CUSTOMER_ID, TEST_CEID)

print(response)

最佳答案

我认为您在这里让自己变得很复杂。让我们以不同的方式分解这个函数:

def get_acct_value(tags, customer_ids, ceid):
if len(customer_ids) == 0:
raise exceptions.CustomerNotFoundError(f"No customer(s) found on {ceid}")
tag = "shared" if len(customer_ids) > 1 else customer_ids[0]
tags["Account"] = tag
return tags

首先,我们知道如果 customer_ids ,一个列表,是空的,我们应该抛出异常。 首先执行此操作。它被标记为“边界检查”,应该在您尝试处理任何数据之前完成 - 这样您就不必在代码的每个分支上重做。

其次,我们知道如果列表大于一个,我们希望我们的标签是“共享的”,这意味着我们有多个客户 ID。让我们设置一个名为 tag 的临时变量如果我们有一个大于一个的列表,则使用“共享”。如果列表正好是一个,我们将其设置为唯一可用的客户 ID。

最后,我们进行实际工作 - 将帐户设置为我们选择的标签。第 4 行和第 5 行可以合并为 tags["Account"] = "shared" if len(customer_ids) > 1 else customer_id[0] .

值得注意的是,您的近端问题是 customer_ids类型传入的必须是一个列表。如果它是一个单独的值,那么您将遇到问题。您尝试通过将其强制转换为一个列表来解决这个问题,但是如果您想接受一个列表或单个值,您最好这样做:

customer_ids = customer_ids if isinstance(customer_ids, list) else [customer_ids]

这会导致类似的结果:

def get_acct_value(tags, customer_ids, ceid):
customer_ids = list() if customer_ids is None else customer_ids
customer_ids = customer_ids if isinstance(customer_ids, list) else [customer_ids]
print(f"type={type(customer_ids)} {customer_ids=}")
if len(customer_ids) == 0:
raise exceptions.CustomerNotFoundError(f"No customer(s) found on {ceid}")
tags["Account"] = "shared" if len(customer_ids) > 1 else customer_ids[0]
return tags

我为 customer_ids 添加了初始检查确保它不是 None ,这将破坏您的第二次检查(如果值不是一个,则将其转换为列表),因为 list(None)抛出 TypeError .

请注意,我会尽快将此函数命名为 update_account_tags()或类似的东西,因为它不返回任何值,只是一个标签字典,它具有更新的帐户值。

一些指导:如果您发现自己正在检查,if a in b ,其中 b 是字典,您打算用 a 做一些事情, 最好的办法是使用字典的功能 get() .

v = b.get(a, my_default)

my_default这里可以是任何你想要的,默认是None .所以这些是等价的:

v = b.get(a)
v = b[a] if a in b else None

其次,如果您发现自己处于这样的检查状态:

if tags["Account"] == customer_id:
pass
else:
tags["Account"] = customer_id

你也可以简单地这样做:

tags["Account"] = customer_id

结果是一样的,而且计算复杂度也一样。 (如果将 customer_id 替换为类似 get_customer_id() 的函数,这可能不完全正确,但作为第一直觉,它对你很好。)

关于python - len 函数未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72551320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com