I think it's more readable with

def f(source: str?, destination: str?, param: int?): ...


Hmmm. But then with default arguments you end up with:

def f(source: str?=def_src, destination: str?=MISSING, param: int?=1): ...  
 
?= looks... not great to me. Though it does look better with spaces:

def f(source: str? = def_src, destination: str? = MISSING, param: int? = 1): ...