GithubHelp home page GithubHelp logo

Comments (4)

orsinium avatar orsinium commented on July 18, 2024

In your example, MResult is a Union of Missing and Result which means you have to return an instance of Missing, not the type itself. But then refining the type on the caller side will be hard.

The scenario you showed is called a "sentinel value", and there is an open issue for supporting it in python typing: python/typing#689 . The current approach is to use an enum with one value:

class Missing(Enum):
    MISSING = 0

def foo(value: bool) -> int | Literal[Missing.MISSING]:
    if value:
        return Missing.MISSING
    return 5

from dramatiq.

jenstroeger avatar jenstroeger commented on July 18, 2024

Oh sorry, I think in that case

MResult = typing.Union[type(Missing), Result]

should work.

from dramatiq.

orsinium avatar orsinium commented on July 18, 2024

type[Missing] kinda would but then you can't use it with Literal, and literal types allow better type refining, especially for override. FOr instance, your example can be rewritten as:

@override
def foo(value: Literal[True] -> Literal[Missing.MISSING]: ...
def foo(value: Literal[False] -> int: ...

def foo(value: bool) -> int | Literal[Missing.MISSING]:
    if value:
        return Missing.MISSING
    return 5

In that case, if I call foo(False), mypy will know that I won't get missing result, only int. Maybe this example doesn't give enough justice to that scenario, though, it plays a bit better with argument types rather than return types. You can find more examples in the issue I linked above.

from dramatiq.

jenstroeger avatar jenstroeger commented on July 18, 2024

I just wanted to suggest a minor adjustment to the existing code, and tried to be as compatible with the existing approach as possible.

Unfortunately I don’t have the bandwidth at the moment to refactor more of the code to add proper typing, and there are other issues which discuss that, e.g.

from dramatiq.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.