Как получить метод класса для обновления словаря? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь создать гибкий анализатор аргументов, который принимает строки, находит внутри них аргументы и создает словарь, подобный следующему:

message = "--mass=12"
physics = comparse(message, "mass", "int", 10, "this is your mass attribute")

Производит: {'mass': 12}

I 'Я не могу обновить и добавить больше аргументов / ключей (например, если я хочу добавить переменную 'vel') в словарь.К сожалению, я новичок в классах Python и, хотя парсер обнаруживает первый аргумент, я не могу добавить его в словарь.Вот моя программа:

import shlex
class comparse(object):
    def __init__(self, message, attribute, var_type, default, help_txt):
        self.data = {}   #This is the "data" dictionary that this function will ultimately return.
        self.message = message
        self.attribute = attribute
        self.var_type = var_type
        self.default = default
        self.help_txt = help_txt

        #Remove unwanted symbols (e.g. "=", ":", etc.)
        self.message = self.message.replace("=", " ")
        self.message = self.message.replace(":", " ")
        self.args = shlex.split(self.message)

    def parse(self):  
        try:
            options = {k.strip('-'): True if v.startswith('-') else v
                for k,v in zip(self.args, self.args[1:]+["--"]) if k.startswith('-') or k.startswith('')}
            if (self.var_type == "int"):
                self.data[self.attribute] = int(options[self.attribute])   #Updates if "attribute" exists, else adds "attribute".
            if (self.var_type == "str"):
                self.data[self.attribute] = str(options[self.attribute])   #Updates if "attribute" exists, else adds "attribute".  
        except:
            if self.attribute not in self.message:
                if (self.var_type == "int"):
                    self.data[self.attribute] = int(self.default)   #Updates if "x" exists, else adds "x".
                if (self.var_type == "str"):
                    self.data[self.attribute] = str(self.default)   #Updates if "x" exists, else adds "x".
        return self.data

    def add_argument(self):
        self.data.update(self.data)

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())

Метод comparse.add_argument не работает.Там явно что-то я делаю не так, а занятия вообще меня смущают!Может кто-нибудь указать, что не так с моей программой?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

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

Обычно, когда вы инициализируете класс (ваш синтаксический анализатор), вы пропускаете его вседанные, что ему нужно сделать свою работу.Однако, похоже, что ваша цель - создать общий физический парсер 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.

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы, удачи!

0 голосов
/ 10 июня 2018

в следующем коде из того, что вы дали

def add_argument(self):
        self.data.update(self.data)

add_argument не принимает никаких аргументов. Но вы сделали переворот

comparse.add_argument(message, "vel", "int", 10, "this is your velocity attribute")

там, где вы далинесколько аргументов.это причина проблемы

Чтобы исправить ее, попробуйте изменить функцию add_argument, чтобы она принимала параметр, который вы хотите обработать

РЕДАКТИРОВАТЬ: на основе вашего комментария функция должна была быть

def add_argument(self,message, attribute, var_type, default, help_txt):
    data = comparse.parse(message, attribute, var_type, default, help_txt) 
    self.data.update(data) 

Но опять же, метод синтаксического анализа фактически не принимает аргументов в вашем коде, поэтому измените его так, чтобы он принимал все необходимые вам аргументы вместе с self

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...