Python中的安全类型转换

32

如何在 Python 中进行安全转换

在 C# 中,可以使用关键字 as 进行安全转换,例如:

string word="15";
var x=word as int32// here I get 15

string word="fifteen";
var x=word as int32// here I get null

Python有类似于这个的东西吗?


9
请注意,Python实际上并没有“类型转换”(casting)这一概念;这只是将值传递给其他类型的构造函数。 - Ignacio Vazquez-Abrams
2
使用C#进行C#编程。在Python中,您应该使用异常而不是空值。 - Jochen Ritzel
1
这在C#中甚至都不是有效的。这是一个编译错误。 - Davy8
5个回答

80

不要认为你不能,你可以自己实现:

def safe_cast(val, to_type, default=None):
    try:
        return to_type(val)
    except (ValueError, TypeError):
        return default

safe_cast('tst', int) # will return None
safe_cast('tst', int, 0) # will return 0

7
如果你预计异常经常发生,我觉得这不是最有效的选择。 - Matt
2
我也会添加TypeError异常。 - d-d

47

我知道这是一篇旧文章,但这可能对某些人有所帮助。

x = int(word) if word.isdigit() else None

2
欢迎来到Stack Overflow!您可能想编辑您的答案以格式化您的代码。例如,您可以在代码行之前添加4个空格来标记它为代码。您可能希望阅读格式化帮助以更好地了解如何正确地标记您的问题和答案。如果它们被良好地格式化,您将获得更好的机会。 - rvbarreto
6
我喜欢这个非常清晰的一行解决方案。此外还有.isdecimal().isnumeric()。如果你想测试只有普通数字,则.isdecimal()最严格:它将考虑0到9的数字有效,但将对类似于¹²³的上下标数字返回False。这个问题有一个很好的讨论,特别是来自'Henry Keiter'的答案。 - Andrew Richards
这就是方法。 - Xan-Kun Clark-Davis
2
三元运算符是一个很好的方式! - Nick Rossik
1
应该避免使用word = '⓪③⑧',因为这会导致int()失败并引发错误。我猜想使用isdecimal()而不是isdigit()可以使其按预期工作。 - lapin

6

我相信你已经听说过“Pythonic”的做事方式。 因此,安全转换实际上依赖于“宁可请求原谅,而不是征得许可”的规则。

s = 'abc'
try:
    val = float(s) # or int 
    # here goes the code that relies on val
except ValueError:
    # here goes the code that handles failed parsing
    # ...       

2
绕过语言缺陷的技巧需要隐藏在函数中,就像Artsiom的回答一样。任何将异常处理分散到其代码库中并称其为“Pythonic”方式的人都不会长久保持就业状态。 - swdev

3

有类似的内容:

>>> word="15"
>>> x=int(word)
>>> x
15


>>> word="fifteen"
>>> x=int(word)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'fifteen'


>>> try: 
...     x=int(word)
... except ValueError:
...     x=None
... 
>>> x is None
True

3
请注意,您不应该使用裸的 except 子句,因此在这种情况下,您需要使用 except ValueError:,否则它会捕获拼写错误、语法错误等。 - Ben Hoyt
1
没错,我本来想只关注重点,但也许展示一下会更好。 - unbeli

-4

强制类型转换仅对变量有效(=内存块,其内容可以更改)

在Python中没有内容可以更改的变量。只有对象,它们不包含在任何东西中:它们本身存在。然后,据我所知,对象的类型不能更改。

因此,在Python中强制类型转换是没有意义的。这是我的信念和观点。如果我错了,请纠正我。

.

由于在Python中强制转换没有意义,因此回答这个问题是没有意义的。
这个问题揭示了对Python基础知识的一些误解,如果你能解释清楚为什么需要进行强制转换,那么你将获得更多的收益。

4
在互联网环境下,查询参数通常以字符串形式表示。为了使这些参数对内部模块有用,你经常需要将 '15' 转换为 15。这只是一个可能的情况。 - Matt
2
好的,这不是强制转换而是一种类型转换。问题仍然是有意义的,没有必要如此消极:-1 - Giacomo d'Antonio
为什么在Python中强制类型转换没有意义?我认为强制类型转换可能会用于实现多态性并减少重复代码……如果我没记错的话……据我所知…… - SebasSBM
TypeError: unsupported operand type(s) for +: 'int' and 'str' - Jason Capriotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接