Как мне сохранить dtype без изменений в kwarg? - PullRequest
0 голосов
/ 19 ноября 2018

Для сценария, над которым я работаю, я хочу сделать необязательным передачу массива в функцию. Способ, которым я пытался это сделать, - сделать соответствующую переменную (residue) kwarg.

Проблема в том, что когда я делаю это таким образом, python меняет тип d dwar для kwarg с numpy.ndarray на dict. Самое простое решение - преобразовать переменную обратно в np.array, используя:

    residue = np.array(residue.values())

Но я не считаю это очень элегантным решением. Поэтому мне было интересно, может кто-нибудь показать мне «более красивый» способ сделать это и, возможно, объяснить, почему Python делает это?

Рассматриваемая функция:

    #Returns a function for a 2D Gaussian model 
    def Gaussian_model2D(data,x_box,y_box,amplitude,x_stddev,y_stddev,theta,**residue):
        if not residue:
            x_mean, y_mean = max_pixel(data) # Returns location of maximum pixel value   
        else:
            x_mean, y_mean = max_pixel(residue) # Returns location of maximum pixel value
        g_init = models.Gaussian2D(amplitude,x_mean,y_mean,x_stddev,y_stddev,theta) 
        return g_init
     # end of Gaussian_model2D

Функция вызывается с помощью следующей команды:

    g2_init = Gaussian_model2D(cut_out,x_box,y_box,amp,x_stddev,y_stddev,theta,residue=residue1)

Версия Python, в которой я работаю, - 2.7.15

.

1 Ответ

0 голосов
/ 19 ноября 2018

См. принятый ответ здесь почему вы всегда получаете объект отображения (он же dict), если вы передаете аргументы через **kwargs; спецификация языка говорит :

Если присутствует форма «** идентификатор», она инициализируется новым упорядоченное отображение, получающее любые лишние ключевые аргументы, по умолчанию новое пустое отображение того же типа.

Другими словами, описанное вами поведение именно то, что гарантирует язык.

Одна из причин такого поведения заключается в том, что все функции, оболочки и реализации в базовом языке (например, C / J) поймут, что **kwargs является частью аргументов и должно быть расширено до его комбинаций ключ-значение , Если вы хотите сохранить свои дополнительные аргументы как объект определенного типа, вы не можете использовать **kwargs для этого; передать его через явный аргумент, например extra_args, который не имеет особого значения.

...