I often find myself defining function args with list[SomeClass] type and think “do I really care that it’s a list? No, tuple or Generator is fine, too”. I then tend to use Iterable[SomeClass] or Collection[SomeClass]. But when it comes to str, I really don’t like that solution, because if you have this function:

def foo(bar: Collection[str]) -> None:
    pass

Then calling foo("hello") is fine, too, because “hello” is a collection of strings with length 1, which would not be fine if I just used list[str] in the first place. What would you do in a situation like this?

  •  Gamma   ( @GammaGames@beehaw.org ) 
    link
    fedilink
    English
    1
    edit-2
    9 months ago

    Oh, I had it backwards! I tried to mess with the hint and couldn’t find anything, maybe an assert?

    from typing import Collection
    
    def foo(bar: Collection[str]):
        assert not isinstance(bar, str)
        print(bar)