在python中安全投射

use*_*618 12 python casting

我在使用python进行转换时遇到问题.

在c#中,我可以通过关键字安全地投射,例如:

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

string word="fifteen";
var x=word as int32// here I get null
Run Code Online (Sandbox Code Playgroud)

python(3.2)有类似的东西吗?

Art*_*nka 50

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

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望异常频繁发生,我觉得这不是最有效的选择。 (3认同)
  • 我也添加了`TypeError`异常 (2认同)

小智 23

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

x = int(word) if word.isdigit() else None
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种非常清晰的单行解决方案。还有`.isdecimal()`和`.isnumeric()`。如果你想测试 _just_ 普通数字,那么 `.isdecimal()` 是最严格的:它将认为 0 到 9 的数字有效,但对于下标或上标数字(如 `¹²³`)将返回 False。[这个问题](/sf/ask/1595257471/)对差异进行了很好的讨论,特别是。来自“亨利·凯特”的答案。 (6认同)
  • 欢迎来到堆栈溢出!您可能需要编辑答案以格式化代码。例如,代码行前的 4 个空格会将其标记为代码。您可能需要阅读[格式化帮助](https://stackoverflow.com/editing-help),以更好地了解如何正确标记您的问题和答案。如果它们的格式良好,您将获得更好的机会。 (2认同)
  • 三元运算符的好方法! (2认同)

Zau*_*bov 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
    # ...       
Run Code Online (Sandbox Code Playgroud)

  • 绕过语言缺陷的黑客需要隐藏在像 Artsiom 的答案这样的函数中。任何在其代码库中传播异常处理并声称其“Pythonic”方式的人都不会长期受雇。 (2认同)