New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
gvanrossum opened this Issue Jun 4, 2016 · 11 comments

Comments

Projects
None yet
6 participants
@gvanrossum
Member

gvanrossum commented Jun 4, 2016

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

@gvanrossum gvanrossum added this to the 3.5.2 milestone Jun 4, 2016

@gvanrossum

This comment has been minimized.

Member

gvanrossum commented Jun 6, 2016

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.

@gnprice

This comment has been minimized.

gnprice commented Jun 6, 2016

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.

@gnprice

This comment has been minimized.

gnprice commented Jun 6, 2016

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

@JukkaL

This comment has been minimized.

Contributor

JukkaL commented Jun 7, 2016

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: ...
@kirbyfan64

This comment has been minimized.

Contributor

kirbyfan64 commented Jun 7, 2016

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

Maybe typing.TYPE_CHECKING?

@JukkaL

This comment has been minimized.

Contributor

JukkaL commented Jun 7, 2016

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.

@gvanrossum

This comment has been minimized.

Member

gvanrossum commented Jun 7, 2016

@markshannon

This comment has been minimized.

markshannon commented Jun 7, 2016

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

@gvanrossum

This comment has been minimized.

Member

gvanrossum commented Jun 7, 2016

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

@matthiaskramm

This comment has been minimized.

Contributor

matthiaskramm commented Jun 7, 2016

I'm happy with typing.TYPE_CHECKING.

@gvanrossum

This comment has been minimized.

Member

gvanrossum commented Jun 7, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment