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
  Type hints and style MaxPowers 1 109 Feb-19-2020, 06:56 PM
Last Post: micseydel
  AttributeError: type object 'FunctionNode' has no attribute '_TestValidateFuncLabel__ binhduonggttn 0 73 Feb-19-2020, 11:29 AM
Last Post: binhduonggttn
  Python Type error! SamAnw 4 128 Feb-14-2020, 03:46 PM
Last Post: buran
  TypeError: size; expecting a recognized type filling string dict a11_m11 0 122 Feb-10-2020, 08:26 AM
Last Post: a11_m11
  type of result of iter() Skaperen 12 567 Feb-07-2020, 07:23 PM
Last Post: Skaperen
  TypeError: type str doesn't define __round__ method emmapaw24 7 285 Feb-03-2020, 08:38 PM
Last Post: snippsat
  TypeError: can't multiply sequence by non-int of type 'str' emmapaw24 2 113 Feb-03-2020, 05:50 PM
Last Post: michael1789
  List items verification for Integer type vintysaw 4 187 Jan-17-2020, 01:56 PM
Last Post: perfringo
  how can i handle "expected a character " type error , when I input no character vivekagrey 2 159 Jan-05-2020, 11:50 AM
Last Post: vivekagrey
  Failed to insert record into MySQL table.Python type tuple cannot be converted farah97 3 452 Dec-26-2019, 02:01 PM
Last Post: buran

Forum Jump:


Users browsing this thread: 1 Guest(s)