[Python-ideas] PEP 550 v2
Yury Selivanov
yselivanov.ml at gmail.com
Wed Aug 16 10:48:50 EDT 2017
On Wed, Aug 16, 2017 at 2:53 AM, Jelle Zijlstra
<jelle.zijlstra at gmail.com> wrote:
[..]
>>
>> The below is an example of how context items can be used::
>>
>> my_context = sys.new_context_item(description='mylib.context')
>> my_context.set('spam')
>
>
> Minor suggestion: Could we allow something like
> `sys.set_new_context_item(description='mylib.context',
> initial_value='spam')`? That would make it easier for type checkers to infer
> the type of a ContextItem, and it would save a line of code in the common
> case.
>
> With this modification, the type of new_context_item would be
>
> @overload
> def new_context_item(*, description: str, initial_value: T) ->
> ContextItem[T]: ...
> @overload
> def new_context_item(*, description: str) -> ContextItem[Any]: ...
>
> If we only allow the second variant, type checkers would need some sort of
> special casing to figure out that after .set(), .get() will return the same
> type.
I think that trying to infer the type of CI values by its default
value is not the way to go:
ci = sys.ContextItem(default=1)
Is CI an int? Likely. Can it be set to None? Maybe, for some use-cases
it might be what you want.
The correct way IMO is to extend the typing module:
ci1: typing.ContextItem[int] = sys.ContextItem(default=1)
# ci1: is an int, and can't be anything else.
ci2: typing.ContextItem[typing.Optional[int]] = sys.ContextItem(default=42)
# ci2 is 42 by default, but can be reset to None.
ci3: typing.ContextItem[typing.Union[int, str]] =
sys.ContextItem(default='spam')
# ci3 can be an int or str, can't be None.
This is also forward compatible with proposals to add a
`default_factory` or `initializer` parameter to ContextItems.
Yury
More information about the Python-ideas
mailing list