Function definition can also be changed inside the interpreter, effectively doing the same work as tge interpreter. The parser can add implicit decorator too.

This raises a different approach: adding a module decorator, allowing such implicit decorations accross module functions. Has it been discussed before?


בתאריך יום ו׳, 8 ביול' 2016, 12:18, מאת ‏<python-ideas-request@python.org>:
Send Python-ideas mailing list submissions to
        python-ideas@python.org

To subscribe or unsubscribe via the World Wide Web, visit
        https://mail.python.org/mailman/listinfo/python-ideas
or, via email, send a message with subject or body 'help' to
        python-ideas-request@python.org

You can reach the person managing the list at
        python-ideas-owner@python.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Python-ideas digest..."


Today's Topics:

   1. Re: Add an option that allow check Type Hints in runtime
      (Chris Angelico)
   2. Re: Add an option that allow check Type Hints in runtime
      (Paul Moore)
   3. Re: Add an option that allow check Type Hints in runtime
      (Chris Angelico)
   4. Re: Add an option that allow check Type Hints in runtime
      (Chris Angelico)
   5. Re: Add an option that allow check Type Hints in runtime (Ma Lin)


----------------------------------------------------------------------

Message: 1
Date: Fri, 8 Jul 2016 18:30:52 +1000
From: Chris Angelico <rosuav@gmail.com>
Cc: python-ideas <python-ideas@python.org>
Subject: Re: [Python-ideas] Add an option that allow check Type Hints
        in runtime
Message-ID:
        <CAPTjJmpgFaxqd7gU407u5c+tURayv3OkvdTJ8RH7N=KbkXXi3Q@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

On Fri, Jul 8, 2016 at 6:19 PM, Ma Lin <animalize81@hotmail.com> wrote:
> I mean real check by the interpreter, not an '__annotations__' attribute.
> And I just had a look, mypy is a static checker, without actually running
> the code.
>
> My thought is modifying CALL_FUNCTION and RETURN_VALUE of the interpreter,
> so that allow them to check in each function calling when option enalbed.
>
> Cite a case:
>
> def fun(a: str, b: int) -> int:
>     return len(a) + b
> fun('arg1', 'arg2')
>
> Whit the option and run this code, the interpreter will give an error
> prompt:
>     Type of argument b is wrong. (or something like this)
>
> This is very useful for development and debugging.

You should still be able to do it without changing the core interpreter.

def enforce_types(func):
    @functools.wraps(func)
    def wrapped(*args, **kw):
        if not args_valid(args, kw, func.__annotations__):
            raise TypeError
        ret = func(*args, **kw)
        if not type_valid(ret, func.__annotations__["return"]):
            raise TypeError
    return wrapped

@enforce_types
def fun(a: str, b: int) -> int:
    return len(a) + b

fun('arg1', 'arg2')


Now all you have to do is write the type_valid function (takes an
object and an annotation, returns True if it matches) and args_valid
(takes the positional and keyword args, pairs them up against the
function's params, and returns True if all(type_valid(...)) for the
args). The only benefit of hacking the interpreter core for this is
that you'd save the hassle of pairing up positional/keyword args
against the parameters.

ChrisA


------------------------------

Message: 2
Date: Fri, 8 Jul 2016 09:50:53 +0100
From: Paul Moore <p.f.moore@gmail.com>
To: Chris Angelico <rosuav@gmail.com>
Cc: python-ideas <python-ideas@python.org>
Subject: Re: [Python-ideas] Add an option that allow check Type Hints
        in runtime
Message-ID:
        <CACac1F-+Si-uXwce2CKPiyM576MX7G+Cp4u8n-TXBO_89UTbdQ@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

On 8 July 2016 at 09:30, Chris Angelico <rosuav@gmail.com> wrote:
> On Fri, Jul 8, 2016 at 6:19 PM, Ma Lin <animalize81@hotmail.com> wrote:
>> I mean real check by the interpreter, not an '__annotations__' attribute.
>> And I just had a look, mypy is a static checker, without actually running
>> the code.
>>
>> My thought is modifying CALL_FUNCTION and RETURN_VALUE of the interpreter,
>> so that allow them to check in each function calling when option enalbed.
[...]
>
> Now all you have to do is write the type_valid function (takes an
> object and an annotation, returns True if it matches) and args_valid
> (takes the positional and keyword args, pairs them up against the
> function's params, and returns True if all(type_valid(...)) for the
> args). The only benefit of hacking the interpreter core for this is
> that you'd save the hassle of pairing up positional/keyword args
> against the parameters.

Just to clarify for the OP - the reason you're getting pushback on
making this a built in interpreter function is twofold - first, an
external facility could be used *now*, and would not need to be
limited to Python 3.6+, and second, adding checks to the function call
protocol is not free, and would therefore affect not just the minority
of people who want to add checks for debugging, but also all other
users (which include people for whom Python's performance is a key
issue). The Python interpreter's function calling process is known to
be slower than (some) people would like, and making it slower - even
marginally - isn't something we would want to do lightly.

With the ability to use external static analyzers like mypy, as well
as the possibility of writing custom solutions like Chris described
above, people wanting such checks have a number of options already,
and so the cost of adding the feature to the interpreter (and possibly
the language - do you see this as a CPython implementation detail, or
would you expect it to be a language-level facility, so other Python
implementations such as PyPy and Jython would be expected to have it
as well?) needs to be justified.

Personally, I'd view this feature as an interesting addition, but not
something I'd use myself, and so I'm inclined towards the "why should
I pay for something I won't use?" position.

Paul


------------------------------

Message: 3
Date: Fri, 8 Jul 2016 19:02:21 +1000
From: Chris Angelico <rosuav@gmail.com>
Cc: python-ideas <python-ideas@python.org>
Subject: Re: [Python-ideas] Add an option that allow check Type Hints
        in runtime
Message-ID:
        <CAPTjJmp_=6PFfnKEeboGuXm=ffM+NB_ysUPNQxvXJUm4UtbFZg@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

On Fri, Jul 8, 2016 at 6:50 PM, Paul Moore <p.f.moore@gmail.com> wrote:
> Just to clarify for the OP - the reason you're getting pushback on
> making this a built in interpreter function is twofold - first, an
> external facility could be used *now*, and would not need to be
> limited to Python 3.6+, and second, adding checks to the function call
> protocol is not free, and would therefore affect not just the minority
> of people who want to add checks for debugging, but also all other
> users (which include people for whom Python's performance is a key
> issue). The Python interpreter's function calling process is known to
> be slower than (some) people would like, and making it slower - even
> marginally - isn't something we would want to do lightly.

Exactly. The main reason IMO is the first one - you can add this
checker to any Python 3 program, rather than wait for it to get coded,
debugged, and shipped.

Oh, and you can easily have a flag that disables checking for performance:

if no_type_checks:
    def enforce_types(func):
        return func

Now your decorator does nothing, and there is literally ZERO run-time
cost (the only cost is a single cheap check when the function is
defined, which usually means on module import), closures aside. That
wouldn't be possible with a core interpreter change, unless it's made
a compile-time option *for the interpreter* - something like
"./configure --with-annotations-enforced" - and then you run python3.6
for the fast one, or python3.6tc for the type-checking one. That would
be a pain.

ChrisA


------------------------------

Message: 4
Date: Fri, 8 Jul 2016 19:05:44 +1000
From: Chris Angelico <rosuav@gmail.com>
Cc: python-ideas <python-ideas@python.org>
Subject: Re: [Python-ideas] Add an option that allow check Type Hints
        in runtime
Message-ID:
        <CAPTjJmrJstnRzEK48Kj7gOZDi5kkfBPrUCNYQqGds3qje-ZFbA@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

On Fri, Jul 8, 2016 at 7:02 PM, Chris Angelico <rosuav@gmail.com> wrote:
> Now your decorator does nothing, and there is literally ZERO run-time
> cost (the only cost is a single cheap check when the function is
> defined, which usually means on module import), closures aside. That
> wouldn't be possible with a core interpreter change...

I really shouldn't say impossible. Literally the moment I clicked
Send, I thought of a way it could be done with minimal run-time cost:
just create a completely separate opcode for "type-checked call". I
don't think that would materially slow down the regular call
operation. As a bonus, any functions that don't have annotations could
use the normal call opcode, so they wouldn't be slowed down.

But the main point is, this would all entail additional complexity
inside CPython, where the decorator method keeps the complexity in
your application - and doesn't need nearly as much of it. The one
advantage that CPython has is, as mentioned, the matching of arguments
to parameters; maybe that could be provided in functools somewhere?

ChrisA


------------------------------

Message: 5
Date: Fri, 8 Jul 2016 09:17:56 +0000
From: Ma Lin <animalize81@hotmail.com>
To: "python-ideas@python.org" <python-ideas@python.org>
Subject: Re: [Python-ideas] Add an option that allow check Type Hints
        in runtime
Message-ID:
        <PS1PR06MB1099F602EB64A07AAC2063F0B63C0@PS1PR06MB1099.apcprd06.prod.outlook.com>

Content-Type: text/plain; charset="Windows-1252"

I see, Chris' decorator is amazing, I didn't think that way.

I mean add an runtime option, not a build option, it can be only enabled
in development/debugging:
     python -tc a.py
Without the option, the interpreter just ignores Type Hints:
     python a.py

Anyway, I just throw an idea to here. Greet to all of you for bring
Python to me.


------------------------------

Subject: Digest Footer

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas


------------------------------

End of Python-ideas Digest, Vol 116, Issue 12
*********************************************