首页 > 解决方案 > 如何动态地将变量转换为另一种类型?

问题描述

假设在 Python 中我有两个不同类型的变量:

A = [1, 2, 3]
B = 4

我想添加BA. 我可以通过放入B一个列表,然后使用+运算符来做到这一点。

A + [B]

但是,这仅适用于列表。我想要一个更通用的解决方案,所以我可以编写一个函数,比如说,concat它需要两件事并尝试将它们放在一起。我们可以假设 的类型A将是某种类型的集合(字符串、列表、集合等)。

我试过这个:

typeA = type(A)
A + typeA(B)

但这会导致错误'int' is not iterable,因为它相当于做list(B). 但是,它适用于字符串和整数:

A = "Hello"
B = 9
typeA = type(A)
A + typeA(B)

我想避免使用一堆if/else来匹配我可能遇到的每种可能的类型组合。有没有这样做的“Pythonic”方式?

标签: pythoncasting

解决方案


您将需要某种条件,但您可以将其包装在一个singleton函数中。这个函数将把它的不可迭代参数包装在一个迭代器(特别是 a generator)中,并按原样返回它的可迭代参数。(注意: astr是可迭代的,所以singleton("foo")会返回"foo",而不是一个只产生的新迭代"foo"。)

def singleton(x):
    try:
        iter(x)
    except ValueError:
        return (y for y in (x,))
    else:
        return x

然后你可以itertools.chain用来连接两个迭代。

>>> from itertools import chain
>>> list(chain([1,2,3], singleton(4)))
[1, 2, 3, 4]
>>> list(chain([1,2,3], singleton((5,6))))
[1, 2, 3, 4, 5, 6]
>>> list(chain([1,2,3], singleton("foo")))
[1, 2, 3, 'f', 'o', 'o']

如果itertools提供类似的东西会很好singleton,但是第三方more-itertools模块确实提供always_iterable了,它做同样的事情(更好的是,它默认将strbytes视为“不可迭代”,并可选择迭代其内容。)

(请检查一下always_iterable,即使您不想安装整个模块。它可能比singleton我上面写的 hacky 版本更好。)


推荐阅读