gpt4 book ai didi

python - 解析参数字符串时依赖 ValueError 是 Pythonic 吗?

转载 作者:行者123 更新时间:2023-12-01 02:30:38 24 4
gpt4 key购买 nike

我的具体担忧是

  1. 在解析参数时, future 的维护者是否能够直观地理解依赖于抛出错误的代码?
  2. 对于默认情况? (看起来可能是根据 https://stackoverflow.com/a/9859202/776940 )

上下文

我有一个参数counter,它确定要递增的计数器的名称,并且可以选择递增与计数器名称之间用=分隔的正整数或负整数。如果未提供增量值,则增量的默认大小为 1。该函数通过分解逗号分隔的计数器和增量列表来提供,因此整个过程的有效输入可能如下所示:

"counter1,counter2=2,counter3=-1"

这会将“counter1”增加 1,将“counter2”增加 2,并将“counter3”减少 1。

我最初是如何写的

counterDescriptor = counterValue.split('=')
if len(counterDescriptor) == 1:
counterName = counterDescriptor[0]
counterIncr = 1
elif len(counterDescriptor) == 2:
counterName = counterDescriptor[0]
counterIncr = int(counterDescriptor[1])
else:
counterName, counterIncr = ('counterParsingError', 1)

当我最近回来查看它时,这让我印象深刻,因为它过于冗长和笨拙。

这是一种或多或少的 Pythonic 方式来编码该行为吗?

def cparse(counter):
try:
desc,mag = counter.split('=')
except ValueError:
desc = counter
mag = ''
finally:
if mag == '':
mag = 1
return desc, int(mag)

通过这些测试用例,我看到:

>>> cparse("byfour=4")
('byfour', 4)
>>> cparse("minusone=-1")
('minusone', -1)
>>> cparse("equalAndNoIncr=")
('equalAndNoIncr', 1)
>>> cparse("noEqual")
('noEqual', 1)

这些测试用例本来可以按照我最初编写的方式(上面)被捕获,但不会以这种方式捕获:

>>> cparse("twoEquals=2=3")
('twoEquals=2=3', 1)
>>> cparse("missingComma=5missingComma=-5")
('missingComma=5missingComma=-5', 1)

最后一个测试用例不会被任何一种方法捕获。两者都会使 int() 呕吐:

>>> cparse("YAmissingComma=5NextCounter")
ValueError: invalid literal for int() with base 10: '5NextCounter'

我很高兴通过提出这个问题发现了这个问题。消耗这个值的服务最终会被它阻塞。我想我可以将函数的一行 return desc, int(mag) 更改为:

    if desc.find("=")<0 and (mag=='0' or (mag if mag.find('..') > -1 else mag.lstrip('-+').rstrip('0').rstrip('.')).isdigit()):
return desc, int(mag)
else:
return 'counterParsingError: {}'.format(desc), 1

(向 https://stackoverflow.com/a/9859202/776940 致敬,因为我发现这是该讨论中提供的确定字符串是否为整数的最快方法)

最佳答案

我会认为Pythonic,尽管你可能更喜欢:

def cparse(counter):
if "=" not in counter:
# early exit for this expected case
return (counter, 1)
desc, mag = counter.split("=", maxsplit=1)
# note the use of the optional maxsplit to prevent ValueErrors on "a=b=c"
# and since we've already tested and short-circuited out of the "no equals" case
# we can now consider this handled completely without nesting in a try block.
try:
mag = int(mag)
except ValueError:
# can't convert mag to an int, this is unexpected!
mag = 1
return (desc, mag)

您可以对此进行调整,以确保在解析 a=b=c 等字符串时获得正确的输出。如果您希望收到 ('a', 1),请保持代码不变。如果您期望 ('a=b', 1),您可以使用 counter.rsplit 而不是 counter.split

关于python - 解析参数字符串时依赖 ValueError 是 Pythonic 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858825/

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