Python:如何强制将值解释为一个字符串的单个元组,而不是字符集合?

问题描述 投票:0回答:1

我正在使用 Python Python 3.10.8

我有一个函数可以将正则表达式分隔的字符串拆分成任意长度的元组。我想计算从我的函数返回的子字符串的数量。但是当源字符串没有定界符,并且我的函数正确返回一个包含单个字符串的元组时,内置的 len() 返回字符串的长度。我怎么知道/强制返回值是单个字符串,而不是字符集合? 此测试功能无法正常工作:

def test_da_tuple(subject_string, expected_length):
    da_tuple = MangleSplitter.tuple_of(subject_string)
    pprint.pprint(da_tuple)
    tuple_len = len(da_tuple)
    assert tuple_len == expected_length, ("\"%s\" split into %d not %d" % (subject_string, tuple_len, expected_length))

还有一些样品

MANGLED_STR_00 = "Jack L. Chalker - Demons of the Dancing GodsUC - #2DG"
CRAZYNESS = "A - B - C - D - F - F - G - H - I"
MANGLED_STR_07 = "Book Over"

我希望我的 test_da_tuple() 为 MANGLED_STR_00 验证 3,为 CRAZYNESS 验证 9,为 MANGLED_STR_07 验证 1。相反,我得到一个断言错误,MANGLED_STR_07 分裂成 9 而不是 1.

python tuples
1个回答
1
投票

...我的函数正确返回一个带有单个字符串的元组,内置的 len() 返回字符串的长度。

不,你的函数没有正确地遵守它的contract, 兑现承诺。

如果你的函数返回

t = ('foo', 'bar')
那么
len(t)
会报告
2
,很好。

如果你的函数返回一个字符串

t = 'baz'
, 这是完全不同的,长度报告为
3
。 你想要的是一个 1 元组:
t = ('baz',)


使用

print()
调试,或者
assert instanceof( ... , tuple)
, 验证它返回一个
tuple
而不是一个
str
.

写一个红色的单元测试来突出显示当前的损失 你抱怨,然后添加错误修复,使测试变成绿色。


编辑

有区别吗

好吧,您选择返回值的方式肯定会有所不同。 这是三个元组。其中一些符合功能的合同。

>>> tuple(('foo', 'bar'))
('foo', 'bar')
>>> 
>>> tuple('abc')
('a', 'b', 'c')
>>> 
>>> tuple(('def',))
('def',)
>>> 
© www.soinside.com 2019 - 2024. All rights reserved.