python - Scala 的 Option 或 Either 是否有 Python 等价物?

标签 python scala functional-programming

我真的很喜欢在 Scala 中使用 Option 和 Either 单子(monad)。 Python中有这些东西的等价物吗?如果没有,那么在不引发异常的情况下,处理错误或“缺少值(value)”的 Pythonic 方式是什么?

最佳答案

一个函数说“我在这一点上没有定义”的pythonic方式是引发一个异常。

>>> int("blarg")
Traceback (most recent call last):
  ...
ValueError: invalid literal for int() with base 10: 'blarg'

>>> dict(foo=5)['bar']
Traceback (most recent call last):
  ...
KeyError: 'bar'

>>> 1 / 0
Traceback (most recent call last):
  ...
ZeroDivisionError: integer division or modulo by zero

这部分是因为没有(通常有用的)python 静态类型检查器。 Python 函数在编译时无法在语法上声明它具有特定的 codomain;没有办法强制调用者匹配函数返回类型中的所有情况。

如果你愿意,你可以(非python方式)编写一个 Maybe 包装器:

class Maybe(object):
    def get_or_else(self, default):
        return self.value if isinstance(self, Just) else default

class Just(Maybe):
    def __init__(self, value):
        self.value = value

class Nothing(Maybe):
    pass

但我不会这样做,除非您尝试将某些东西从 Scala 移植到 Python 而不做太多更改。

关于python - Scala 的 Option 或 Either 是否有 Python 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992433/

相关文章:

java - 用最少的字符表示长

带有案例的 Python map()

java - 在 Java 8 中组合函数和谓词

python - 使用 odo 转换 pandas hdfstore 时维护数据列

python - 在 python 中,如果我对复杂数据执行 fft,然后仅对正频率进行 irfft,这对数据有何影响?

scala - 错误 : value <> is not a member of. 光滑

scala - 使用 Http header 对 spray-client 的响应进行解码

javascript - 是否有有效的数组 monad 转换器?

python - Matplotlib 在多行之间填充

python - 使用 IPython 调试时变量为某个值时中断?