Skip to content

Add a constant that's False at runtime but True when type checking #230

Description

@gvanrossum

This would provide a standard idiom for including imports that are only necessary while type checking, see e.g. python/mypy#1646 (which currently recommends if False: import ... because that's the only way to do it).

Activity

  1. added this to the 3.5.2 milestone on Jun 4, 2016
  2. gvanrossum commented on Jun 6, 2016

    @gvanrossum
    MemberAuthor

    There's one case where I think the if False: idiom may still be needed: to import the typing module itself. Some code has the constraint that it shouldn't depend on any 3rd party packages. For Python 2.7 and for 3.2--3.4 the only reasonable ways to do that are either

    if False:
        from typing import ...

    or

    try:
        from typing import ...
    except ImportError:
        ...

    To survive the non-existence of the typing module, some idioms can't be used (especially type aliases, type variables, and generic classes) but many others are still available (especially # type comments for function signatures and variables, and function annotations in string quotes).

    We probably should add some language to the PEP to direct type checkers to support at least one of these (which would then become the preferred way). Currently I've mostly been recommending if False: for this, because it's easiest to write.

  3. gnprice commented on Jun 6, 2016

    @gnprice

    This would be nice to get into the 3.5.2 release if we can.

    Some name ideas:

    typing.in_typechecker
    typing.in_type_system
    not typing.at_runtime
    typing.typechecker is not None  # else 'mypy', 'pytype', 'semmle', etc.
    

    Out of those I think I'd go for in_typechecker (or in_type_checker), but I don't have a strong view.

  4. gnprice commented on Jun 6, 2016

    @gnprice

    /cc @markshannon , since this came up in discussion at PyCon last week

  5. JukkaL commented on Jun 7, 2016

    @JukkaL
    Contributor

    Here are some more ideas (with an usage example to better illustrate what it would look like):

    if typing.type_checker:   # could be similar to Greg's typechecker, but with _
        from model import Person
    
    if typing.type_check:
        from model import Person
    
    if typing.TYPE_CHECK:   # this is probably my favorite
        from model import Person
    
    if typing.CHECKER:
        from model import Person
    
    if typing.STATIC:
        from model import Person
    
    if typing.ANALYZE:
        from model import Person
    
    if not typing.RUNNING:
        from model import Person
    
    if not typing.RUNTIME:
        from model import Person
    

    Also, should this be okay if I don't want to use string literals in annotations:

    if TYPE_CHECK:
        from model import Person
    else:
        Person = 'Person'
    
    def show(p: Person) -> None: ...
    
  6. refi64 commented on Jun 7, 2016

    @refi64

    IMO it really should be some kind of present tense verb to emphasize "if currently type checking".

    Maybe typing.TYPE_CHECKING?

  7. JukkaL commented on Jun 7, 2016

    @JukkaL
    Contributor

    TYPE_CHECKING sounds pretty good to me. This (along with many of the other suggestions) has the minor drawback that it implies a particular sort of tool, even though other tools such as pure type inference tools, refactoring tools or IDEs that don't do type checking can also use these imports.

  8. gvanrossum commented on Jun 7, 2016

    @gvanrossum
    MemberAuthor
  9. markshannon commented on Jun 7, 2016

    @markshannon
    Member

    We could generali(s|z)e TYPE_CHECKING to STATIC_CHECKING, but TYPE_CHECKING is fine (I don't want to bike shed too much).

  10. gvanrossum commented on Jun 7, 2016

    @gvanrossum
    MemberAuthor

    @matthiaskramm any objection to TYPE_CHECKING?

    --Guido (mobile)
    On Jun 7, 2016 11:24 AM, "Mark Shannon" notifications@github.com wrote:

    We could generali(s|z)e TYPE_CHECKING to STATIC_CHECKING, but
    TYPE_CHECKING is fine (I don't want to bike shed too much).

    —
    You are receiving this because you authored the thread.
    Reply to this email directly, view it on GitHub
    #230 (comment), or mute
    the thread
    https://github.com/notifications/unsubscribe/ACwrMhol27dTYRoZwmWAO4dekhcy3jg4ks5qJbddgaJpZM4IuLP7
    .

  11. matthiaskramm commented on Jun 7, 2016

    @matthiaskramm
    Contributor

    I'm happy with typing.TYPE_CHECKING.

  12. gvanrossum commented on Jun 7, 2016

    @gvanrossum
    MemberAuthor
  13. added a commit that references this issue on Jun 7, 2016
    2496ab4
  14. added a commit that references this issue on Jun 8, 2016
    600c07f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions