- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个函数,该函数根据传入的标签字典将附加标签应用于 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!