Dynamic Keyword Arguments in Python?

前端 未结 4 1804
灰色年华
灰色年华 2020-12-01 10:24

Does python have the ability to create dynamic keywords?

For example:

qset.filter(min_price__usd__range=(min_price, max_price))

I w

相关标签:
4条回答
  • 2020-12-01 10:39

    Yes, sort of. In your filter method you can declare a wildcard variable that collects all the unknown keyword arguments. Your method might look like this:

    def filter(self, **kwargs):
        for key,value in kwargs:
            if key.startswith('min_price__') and key.endswith('__range'):
                currency = key.replace('min_price__', '').replace('__range','')
                rate = self.current_conversion_rates[currency]
                self.setCurrencyRange(value[0]*rate, value[1]*rate)
    
    0 讨论(0)
  • 2020-12-01 10:42

    You can easily do this by declaring your function like this:

    def filter(**kwargs):
    

    your function will now be passed a dictionary called kwargs that contains the keywords and values passed to your function. Note that, syntactically, the word kwargs is meaningless; the ** is what causes the dynamic keyword behavior.

    You can also do the reverse. If you are calling a function, and you have a dictionary that corresponds to the arguments, you can do

    someFunction(**theDictionary)
    

    There is also the lesser used *foo variant, which causes you to receive an array of arguments. This is similar to normal C vararg arrays.

    0 讨论(0)
  • 2020-12-01 10:43

    If I understand what you're asking correctly,

    qset.filter(**{
        'min_price_' + selected_currency + '_range' :
        (min_price, max_price)})
    

    does what you need.

    0 讨论(0)
  • 2020-12-01 10:58

    Yes, It does. Use **kwargs in a function definition.

    Example:

    def f(**kwargs):
        print kwargs.keys()
    
    
    f(a=2, b="b")     # -> ['a', 'b']
    f(**{'d'+'e': 1}) # -> ['de']
    

    But why do you need that?

    0 讨论(0)
提交回复
热议问题