> On 14 Oct 2021, at 12:21 PM, Steven D'Aprano <st...@pearwood.info> wrote:
> 
> 
> Why abbreviate list and tuple but not string?
> 
Empty strings would be confusing as a type unless you mean a Literal empty 
string.     We just limit the picture of the type to lists, tuples, dicts, and 
sets. Builtin most often used collections. Imagine you have a default parameter 
like this... name: “” = “”. This adds unnecessary confusion.

> Not really. Your first example is explicit and I can get the meaning by 
> just reading it out loud:
> 
>    tuple[list[list[str]], list[list[str]]]
> 
>    "tuple (of) list (of) list (of) str, list (of) list (of) str
> 
> Your abbreviated version:
> 
>    ([[str]], [[str]])
> 
> is too terse. I have to stop and think about what it means, not just 
> read it out loud. Without the hint of named types (tuple and list), my 
> first reaction to seeing [str] is "is this an optional string?".

I am a visual guy. ([[str]], [[str]]) is much easier to my eyes than reading 
tuple (of) list (of) list (of) str, list (of) list (of) str. 

> don't look like "optional" to me

Optional would be Optional[str] or str | None, not [str]. 

> No, because the # indicates that the rest of the line is a comment. This 
> is already legal:
> 
>    def func(d: {str  # this is an actual comment
>                 : int}) -> Any: ...
> 
> so this would be ambiguous between a real comment and an annotation.
> 
> Even if we agreed to change the behaviour of comments, you suggested:
> 
>    func(d: {str # product label: [float] # prices from 2000 to 2015})
> 
> How is the interpreter to know that the first annotation is just
> 
>    "product label"
> 
> rather than this?
> 
>    "product label: [float] # prices from 2000 to 2015"
> 
> So I don't think this works.
> 

# is not a good idea I agree. How about the following for Annotated:

func(d: {str & "product label": [float]  & "prices from 2000 to 2015"})? 

The “&” is similar to “& co.” (and company). They come together but the first 
one is the group leader and represents all of them. It works in an opposite way 
to “|” (or), which gives importance equally to the members. 

def func(
        time: float & “hours” & datetime.timedelta.total_seconds()/3600,
        verbose: bool & “option for long text” = False,
) -> str: … 

Abdulla 



_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/OGAMCS4GERWUM47AXHHYPZYGJHQDK7MK/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to