Is there a Python equivalent for Scala's Option or Either?

前端 未结 8 1592
忘掉有多难
忘掉有多难 2021-02-05 01:26

I really enjoy using the Option and Either monads in Scala. Are there any equivalent for these things in Python? If there aren\'t, then what is the pythonic way of handling erro

8条回答
  •  我在风中等你
    2021-02-05 01:36

    The pythonic way for a function to say "I am not defined at this point" is to raise an exception.

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

    This is, in part, because there's no (generally useful) static type checker for python. A Python function cannot syntactically state, at compile time, that it has a particular codomain; there's no way to force callers to match all of the cases in the function's return type.

    If you prefer, you can write (unpythonically) a Maybe wrapper:

    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
    

    But I would not do this, unless you're trying to port something from Scala to Python without changing much.

提交回复
热议问题