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?

  • 𝕨𝕒𝕤𝕒𝕓𝕚@feddit.deOP
    link
    fedilink
    arrow-up
    3
    ·
    10 months ago

    Maybe something like passing in a list of patterns which should match some data, or a list of files/urls to download would be examples of where I would like to be generic, but taking in a string would be bad.

    But the real solution be to convert it to foo(*args: str). But maybe if you take 2 Container[str] as input so you can’t use *args. But no real world example comes to mind.