【问题标题】:Safe casting in pythonpython中的安全铸造
【发布时间】:2011-06-13 11:55:40
【问题描述】:

如何在 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有类似的东西吗?

【问题讨论】:

  • 请注意,Python 实际上并没有 转换;这只是将值传递给其他类型的构造函数。
  • 使用 C# 进行 C# 编程。在 Python 中,您希望使用异常,而不是空值。
  • 这在 C# 中甚至无效。这是一个编译错误。

标签: python casting


【解决方案1】:

别想,但你可以实现自己的:

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

【讨论】:

  • 如果您希望经常发生异常,我觉得这不是最有效的选择。
  • 我也会添加TypeError 例外
【解决方案2】:

我确实意识到这是一篇旧帖子,但这可能对某些人有所帮助。

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

【讨论】:

  • 欢迎堆栈溢出!您可能需要编辑您的答案以格式化您的代码。例如,代码行前的 4 个空格会将其标记为代码。您可能想阅读formating help 以更好地了解如何正确标记您的问题和答案。如果格式正确,您将获得更好的机会。
  • 我喜欢这种非常清晰的单行解决方案。还有.isdecimal().isnumeric()。如果你想测试 just 普通数字,那么.isdecimal() 是最严格的:它会认为 0 到 9 的数字有效,但对于像 ¹²³ 这样的子或上标数字会返回 False。 This question 对差异进行了很好的讨论,尤其是。来自“亨利·凯特”的答案。
  • 就是这样。
  • 三元运算符的好方法!
  • 应该避免这种情况,因为使用word = '⓪③⑧' 将导致int() 失败时引发错误。我猜想使用isdecimal() 而不是isdigit() 会使这项工作按预期进行。
【解决方案3】:

我相信,您已经听说过“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
    # ...       

【讨论】:

  • 绕过语言缺陷的黑客需要隐藏在像Artsiom's answer这样的函数中。任何在他们的代码库中传播异常处理并说它是“Pythonic”方式的人都不会长期受雇。
【解决方案4】:

也有类似的:

>>> 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

【讨论】:

  • 请注意,千万不要使用裸的 except 子句,所以在这种情况下要使用except ValueError:,否则会发现拼写错误、语法错误等。
  • 是的,我只想专注于这一点,但最好也表明这一点。
【解决方案5】:

强制转换仅对变量有意义(= 内容可以更改的内存块)

在 Python 中没有可以改变内容的变量。只有对象,不包含在某物中:它们本身存在。然后,对象的类型不能改变,AFAIK。

那么,在 Python 中强制转换是没有意义的。这是我的信念和看法。如果我错了,请纠正我。

.

由于强制转换在 Python 中没有意义,因此尝试回答这个问题是没有意义的。

这个问题揭示了对 Python 基础知识的一些误解,在解释了导致你认为你需要转换某些东西的原因之后,你将获得更多的利润来获得答案

【讨论】:

  • 在 Internet 上下文中工作时,查询参数表示为字符串。为了使这些参数对您的内部模块有用,您通常必须将“15”转换为 15。这只是一种可能的情况。
  • 好吧,不是强制转换是转换。无论如何,这个问题是有道理的。没必要这么消极:-1
  • 为什么在 Python 中强制转换没有意义?我认为强制转换可用于以最少的重复代码实现多态性... IIRC ... AFAIK ...
  • TypeError: unsupported operand type(s) for +: 'int' and 'str'
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 2018-04-23
  • 2021-11-09
  • 2019-07-21
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多