Я немного озадачен тем, как устроен ваш класс.Я ответил на вопрос более целостным образом, предлагая варианты того, как, возможно, вам следует изменить дизайн своего класса, чтобы лучше достичь своей цели.
Обычно, когда вы инициализируете класс (ваш синтаксический анализатор), вы пропускаете его вседанные, что ему нужно сделать свою работу.Однако, похоже, что ваша цель - создать общий физический парсер physics = comparse()
, а затем добавить возможные аргументы, такие как масса и скорость, в данные физического парсера.Затем вы даете парсеру физики строку сообщения типа message = "-mass: 12 --vel= 18"
, для которой он должен проанализировать и извлечь аргументы.Это может означать, что конец вашего фрагмента кода, который в настоящее время
message = "-mass: 12 --vel= 18"
physics = comparse(message, "mass", "int", 10, "this is your mass attribute")
comparse.add_argument(message, "vel", "int", 10, "this is your velocity attribute")
print (physics.parse())
должен выглядеть так:
message = "-mass: 12 --vel= 18"
# create a parser
physics = comparse()
# tell the parser what arguments it should accept
comparse.add_argument("vel", "int", 10, "this is your velocity attribute")
comparse.add_argument("mass", "int", 10, "this is your mass attribute")
# give the parser a specific message for which it should extract arguments
print (physics.parse(message))
Этот фрагмент кода создаст парсер, скажите парсеру, какие сортировкиаргументов, которые он должен принять (например, скорость и масса), а затем извлечь эти аргументы из определенной строки message
.
Этот дизайн лучше соответствует принципам объектно-ориентированного программирования.Преимущества здесь в том, что вы создаете синтаксический анализатор physics
, который можно использовать повторно, а затем запрашиваете его анализировать строки, которые он не сохраняет в своих собственных свойствах (нет this.message
).Таким образом, вы можете сделать дополнительные вызовы, такие как «phys.parse (" - mass: 40 --vel = 15 ") и повторно использовать синтаксический анализатор физики.
Если этот дизайн более точно соответствует вашим намерениям, я быизмените код следующим образом:
- измените вашу функцию init , чтобы она не принимала никаких параметров.
- Поскольку у вас есть несколько аргументов, которые вы храните в своем классе, вместо того, чтобы
self.attribute, self.var_type, self.default, self.help_txt
были просто отдельными переменными, я бы сделал их массивами, чтобы вы могли добавлять имена атрибутов, типы переменных, значения по умолчанию и справку.тексты для КАЖДОГО аргумента.Инициализируйте каждый из них как пустые массивы в init примерно так: self.defaults = []
.Я бы также изменил имя каждого из них, чтобы указать, что это массивы, а не отдельные переменные, поэтому значения по умолчанию, типы, тексты и т. Д. Измените add_argument следующим образом:
defadd_argument (self. attribute, var_type, default, help_txt):
self.attributes.append (атрибут)
self.var_types.append (var_type)
self.defaults.append (по умолчанию)
self.help_txts.append (по умолчанию)
Измените синтаксический анализатор, приняв message
в качестве параметра, удалите его ненужные символы, выполните разделение, а затем выполните его логику для каждого аргумента, который вынастроить в add_argument.
Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы, удачи!