Учитывая, что объект python уже создан, есть ли способ узнать фактические параметры конструкции путем проверки? - PullRequest
0 голосов
/ 12 февраля 2019
  • Если объект уже создан, каков наилучший способ выяснить, как он был создан?По сути, я хотел бы выяснить фактические параметры при создании объекта (в конечном итоге фактические параметры передаются методу класса init ).

  • Обратите внимание, что я имею в видуфактические параметры здесь, а не формальные параметры.Формальные параметры могут возможно принимать 20 различных параметров, возможно, 16 из них являются необязательными со значениями по умолчанию каждый.При фактическом вызове (т.е. создании экземпляра объекта), возможно, задаются только 5 параметров, и 3 из них совпадают со значением по умолчанию.

  • Я хотел бы получить эти 5 параметров и их значения после создания объекта.

  • Для примера кодаДопустим, класс интереса называется Kmodel.Конструктор Kmodel принимает 20 различных параметров (16 из них не должны быть указаны вызывающей стороной).

  • В коде вызывающей стороны это будет что-то вроде: kmodel = Kmodel( param1 = 10, param2 = None, param3 = "name3", param4 = [1, 3, 5], param5 = dict("keyx": "valuey"}) ...

  • Позже вызовем метод для выяснения фактических параметров, вызвав Kmodel () <br> figure_out_actual_params(kmodel)

  • Теперь реализацию кода выясним: def figure_out_acutal_params( kmodel ): ...

  • вот код, который необходимо реализовать для восстановления фактических параметров, вызывающих создание Kmodel

  • Я исследовал модуль проверки.Хотя inspect может выводить много информации, мне не ясно, как узнать, что фактический параметр был указан при создании объекта kmodel.

Спасибо!

PS.Обратите внимание, что есть несколько похожих вопросов на эту тему, и я прочитал их все.Я не думаю, что этот вопрос тот же.На мой вопрос я могу запросить все внутренние атрибуты объекта объекта, и я все еще не могу сказать, какой из них был указан во время фактического создания объекта.(Проблема заключается в том, что фактический параметр может оказаться значением по умолчанию.)

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете добавить секцию в секцию __init__, которая, возможно, сохраняет входные переменные?

class MyThing:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
        self.initial_settings = [arg1, arg2]

Тогда, пока вы никогда не перезаписываете self.initial_settings, в ней будут храниться значения, которые были инициализированы (оставляя вас свободными, например, изменить self.arg1).Вы также можете включить некоторую логику if, чтобы определить, был ли параметр по умолчанию перезаписан при создании (хотя я не верю, что есть способ определить, было ли введено начальное значение, равное значению по умолчанию).В противном случае, я думаю, вам придется использовать dir(some_object_instance) для определения текущих атрибутов, но я не думаю, что есть какой-либо другой способ определения начальных атрибутов, кроме хранения их во время инициализации ...

...