Могу ли я передать только имя ключевого слова аргумента ключевого слова в функции-оболочке Python?

#python

#python

Вопрос:

Я покопался в вопросах, и, похоже, я не могу заставить это работать.

По сути, я хочу передать необязательное ключевое слово в «wrapperfunc», чтобы я получал относительные данные из функции «load_data», которую она вызывает. Я хочу, чтобы аргумент wrapperfunc указывал, какой метод выполняется для данных.

Я уверен, что это случай правильной распаковки аргументов?

 import numpy as np

def load_data(remove_smallest = None, remove_largest = None):
    data = np.arange(0,100,1)
    if remove_smallest != None:
        data = data[remove_smallest::]
    elif remove_largest != None:
        data = data[0:(100-remove_largest)]
    else:
        data = data
    return print(data)
    

def wrapperfunc(**args):
    val = [10, 20, 30]
    for v in val:
        load_data(args = v)


wrapperfunc(remove_smallest)
wrapperfunc(remove_largest)
  

Ответ №1:

**kwargs это просто dicts of str: object , поэтому вы можете заставить оболочку взять имя ключа, создать из него dict и использовать его для вызова обернутой функции:

 def wrapperfunc(key):
    val = [10, 20, 30]
    for v in val:
        load_data(**{key: v})


wrapperfunc('remove_smallest')
wrapperfunc('remove_largest')
  

Ответ №2:

Нет, аргументы ключевого слова являются чисто синтаксическими, хотя имя и значение собираются в a dict , если имя не соответствует именованному параметру.

Самое близкое, что вы можете сделать, это передать str значение, а затем передать unpacked dict to load_data .

 def wrapper(arg):
    val = [10, 20, 30]
    for v in val:
        load_data(**{arg: v})

wrapper('remove_smallest')
  

Комментарии:

1. «Нет, аргументы ключевого слова являются чисто синтаксическими» именованные аргументы абсолютно не являются «чисто синтаксическими». Может быть, вы имели в виду «символический», поскольку они являются символами? «Чисто синтаксический» будет означать, что они не существуют во время выполнения, что они, безусловно, делают.

2. Да, это так. Это синтаксический способ присвоения значения параметру по имени, а не по позиции, или для заполнения ** параметра. Передача явно распакованного словаря — это еще один способ указать значения по имени.

3. Это не то, что означает «чисто синтаксический». И аргументы ключевого слова не обязательно передаются как dict .

4. Обращение к байтовым кодам (специфичным для CPython) полностью обходит проблему синтаксиса. Я говорю об исходном коде Python.