解析字符串并分配给同一个变量?

2024-05-13 22:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

用不同类型的值重新分配变量是一种python方式吗

我有一个来自命令行的k1:v1,k2:v2,k3:v3形式的字符串。解析它很简单:

kvs=args.kvs
if kvs is not None:
    kvs = [(kv[0], kv[1]) for kv in [kv_str.split(':') for kv_str in kvs.split(',')]]   

由于我是从严格类型化语言开始学习python的,因此这种方法在我看来并不干净,因为它被重新分配了一种不同的类型

它会被认为是解析字符串的pythonic解决方案吗


Tags: 字符串命令行in类型for方式k2k1
2条回答

简短答复:

这是一个很好的方法。尽管您可以只执行if kvs:,因为在Python中空集合类型被认为是错误的(当然,如果这适合您的情况)

长答覆:

不幸的是,这真的只是Python世界的观点。从严格类型语言到Python,你会看到人们用更严格的语言做不鼓励或禁止的事情

尽管如此,我认为尽可能避免变异,如果类型发生变化,则创建一个新变量总是更安全的。在没有类型检查的情况下传递参数的大型代码库中,这种方法可以在将来节省大量调试时间

另一种方式是将列表对象分配给一个新变量

kvs = "k1:v1,k2:v2,k3:v3"

kv_pairs = [
    tuple(kv_str.split(':'))
    for kv_str in kvs.split(',')
] if kvs else []

编辑:修复了我发布的代码示例

这还不错,但您可能会发现在参数解析期间解析它更干净。例如,在argparse中,可以使用自定义的类型

import argparse

def kvs_string(kvs):
    if not kvs:
        return []  # Since str.split will return "['']"
    return [tuple(kv.split(':')) for kv in kvs.split(",")]

parser = argparse.ArgumentParser()
parser.add_argument(' kvs', type=kvs_string)

for args in [], [' kvs', ''], [' kvs', 'k1:v1,k2:v2,k3:v3']:
    print(parser.parse_args(args))

输出:

Namespace(kvs=None)
Namespace(kvs=[])
Namespace(kvs=[('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])

相关问题 更多 >