This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Proposal: add an "ensure(arg)" builtin for parameter validation
Type: enhancement Stage: resolved
Components: Versions:
process
Status: closed Resolution: postponed
Dependencies: Superseder:
Assigned To: Nosy List: brett.cannon, ncoghlan, r.david.murray, smarie, steven.daprano, xgdomingo
Priority: normal Keywords:

Created on 2018-01-18 05:32 by ncoghlan, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (7)
msg310219 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-18 05:32
This proposal is an outcome of repeated requests on python-ideas that assert statements be made unconditional, so they can be legitimately used for parameter validation, rather than solely as a form of inline self-test.

Rather than changing the assert statement, an alternative option would be to provide a new builtin (suggested name: "ensure") that raises ValidationError (a new subclass of AssertionError) if the first argument is false.

As a function, the new builtin could accept parameters for:

- the message to be reported on failure
- the exception type to be raised on failure

And since it would only be a new builtin rather than a new keyword, existing uses of the name "ensure" would be unaffected (except to the extent that linters may start warning about shadowing a builtin).

(Since it's a suggestion for a new builtin, actually doing this would require a PEP, which I'm not planning to write, I just wanted to get the suggestion explicitly on the record rather than leaving it buried in mailing list archives)
msg310225 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2018-01-18 06:52
Oh I can just imagine the bike-shedding on this one :-)

I'm not really convinced this is needed, but for what it's worth I think that given the intended use-case (checking function parameters) ValueError would be a more appropriate default exception type. The given argument has the wrong value, hence ValueError.

On the other hand, it is more common (at least for me) to check arguments with isinstance, so maybe the default should be TypeError.

Definitely needs a PEP.
msg310231 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2018-01-18 10:41
Since this is intended for argument checking, i.e. testing preconditions, the Eiffel term "require" seems more appropriate.

https://www.eiffel.org/doc/eiffel/ET:%20Design%20by%20Contract%20(tm),%20Assertions%20and%20Exceptions#Preconditions
msg310243 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2018-01-18 14:41
I'm not clear why we want a bug tracker issue for something that is still only an idea.  We generally *send* people to python-ideas when they propose half-baked ideas here :)  (Not actually saying your idea is half-baked, but it clearly isn't fully baked since there's no PEP.)  

There is literally no point in discussing this proposal here.  Normally for an issue like this (where we've redirected someone to python-ideas for discussion) we would close the issue and tell them to come back and re-open it if there is a positive consensus on python-ideas.  Since you are designating this as PEP level, there seems to be no reason to keep the issue open.
msg310255 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2018-01-18 19:34
I agree w/ David that this idea is premature. Plus I say it's easier to make it so -O is more fine-grained so you can leave in asserts but get __debug__ set to False.
msg310280 - (view) Author: Sylvain Marie (smarie) * Date: 2018-01-19 18:12
Very much interested by the topic.

For reference I tried to summarize the status of inline type and value validation here: https://smarie.github.io/python-valid8/why_validation/

And I proposed a solution with a library here https://smarie.github.io/python-valid8 (with a somewhat smart handling of the ValueError / TypeError inheritance dilemma, for what's worth)
msg310453 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2018-01-23 00:19
I agreed that this idea isn't really baked enough for an RFE yet, so I'm marking this as "postponed" for now.

The main requirement for getting it back out of "postponed" state would be having someone that's sufficiently interested to write a PEP and wrangle some related python-ideas threads.
History
Date User Action Args
2022-04-11 14:58:56adminsetgithub: 76771
2018-02-02 02:40:26xgdomingosetnosy: + xgdomingo
2018-01-23 00:19:44ncoghlansetstatus: open -> closed
resolution: postponed
messages: + msg310453

stage: resolved
2018-01-19 18:12:22smariesetnosy: + smarie
messages: + msg310280
2018-01-18 19:34:17brett.cannonsetnosy: + brett.cannon
messages: + msg310255
2018-01-18 14:41:05r.david.murraysetnosy: + r.david.murray
messages: + msg310243
2018-01-18 10:41:10steven.dapranosetmessages: + msg310231
2018-01-18 06:52:11steven.dapranosetnosy: + steven.daprano

messages: + msg310225
stage: needs patch -> (no value)
2018-01-18 05:32:11ncoghlancreate