Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Type hinting - return type based on parameter
#1
I've had the pleasure of writing some Python at work recently, but I was stumped by something. I want something like this:
def get_from_dict(d: dict, key: str, value_type = int) -> type(value_type):
    value = d.get(key)
    if value is None:
        raise RuntimeError(f"Tried to fetch {key} from dictionary {d} but dictionary did not have the key.")

    return value_type(value)
My workaround was to hard-code it as int because that's my use case, but while I was writing the code, I wanted to make it more generic. I doubt this is possible, at least in the current state of Python's type hinting, but does anyone happen to have any ideas?
Feel like you're not getting the answers you want? Checkout the help/rules for things like what to include/not include in a post, how to use code tags, how to ask smart questions, and more.

Pro-tip - there's an inverse correlation between the number of lines of code posted and my enthusiasm for helping with a question :)
Quote
#2
You always can define a custom decorator, e.g.

import inspect
from functools import wraps
from typing import Any

def set_rettype_as_var(variable_name):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs_inner):
            return f(*args, **kwargs_inner)
        
        desired_type = Any
        signature = inspect.getfullargspec(f)
        if signature.kwonlydefaults and variable_name in signature.kwonlydefaults:
            desired_type = type(signature.kwonlydefaults.get(variable_name))
            # probably, you can take into account signature.annotations ... 
            
        if signature.args and variable_name in signature.args:
            if signature.defaults is not None:
                desired_type = type(signature.defaults[signature.args.index(variable_name)])
            else:
                desired_type = signature.annotations.get(variable_name, Any)
            
        # maybe you will need to define some other conditions .... 
        
        wrapper.__annotations__['return'] = desired_type
        return wrapper
    return decorator
@set_rettype_as_var('x')
def a(x:float):
    pass
a.__annotations__
Error:
{'x': float, 'return': float}
micseydel likes this post
Quote
#3
That's not quite what I'm looking for. The return type is specified at function definition, when I want it to depend on the type of the value of the argument, not a fix parameter type.
Feel like you're not getting the answers you want? Checkout the help/rules for things like what to include/not include in a post, how to use code tags, how to ask smart questions, and more.

Pro-tip - there's an inverse correlation between the number of lines of code posted and my enthusiasm for helping with a question :)
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  ctypes and custom data type (structures, pointer to structures) python_user_n 0 71 Jul-08-2020, 05:52 PM
Last Post: python_user_n
  SQLAlchemy with type hints gontajones 1 170 Jun-17-2020, 06:52 PM
Last Post: gontajones
  check pandas variable type cools0607 3 151 Jun-12-2020, 09:28 AM
Last Post: buran
  TypeError: unhashable type: 'set' Stager 1 176 Jun-08-2020, 04:11 PM
Last Post: bowlofred
  TypeError: __repr__ returned non-string (type dict) shockwave 0 208 May-17-2020, 05:56 PM
Last Post: shockwave
  Type hinting style and PEP8 hlovatt 2 275 May-07-2020, 08:12 PM
Last Post: hlovatt
  Type conversion issue while using Descriptor in Python3 mailnsuresh 1 159 May-07-2020, 12:26 PM
Last Post: deanhystad
  Type error: '>' not supported between instances of 'NoneType' and 'int' spalisetty06 1 402 Apr-29-2020, 06:41 AM
Last Post: buran
  calculate_bai -- TypeError: unsupported operand type(s) for *: 'float' and 'NoneType' pantherd 1 288 Apr-21-2020, 12:31 PM
Last Post: anbu23
  How to iterate dict_values data type nisusavi 2 241 Apr-17-2020, 08:06 PM
Last Post: nisusavi

Forum Jump:


Users browsing this thread: 1 Guest(s)