Генератор вместо понимания списка? И где еще я могу улучшить свой класс? - PullRequest
4 голосов
/ 27 февраля 2012

Я довольно новичок в Python. В последнее время я изучал концепцию классов в python. Что ж, для пары сценариев, которые я написал, я подумал, что было бы удобно определить класс, который объединяет SQL-оператор (на диалекте ArcGis). Ничего особенного на самом деле. Вот что я придумал. Я спрашиваю две вещи: во-первых, общие недостатки? Предложения по улучшению? Во-вторых, я немного застрял с кодом последней функции def constructor. На самом деле я хочу вернуть кортеж из словаря, а не список. Но понимание списка приятно. Так что насчет генератора? Я не могу точно понять, как это сделать ...

class ArcSql:
    type_book = {'str':("'","'"), 'int':("", "")}
    format_book = dict(shp=("'","'"), GDB=("[","]"))

    def __init__(self,colom_name, values_list, value_type = 'str', arc_format ='shp'):
        self.colom = colom_name
        self.values = values_list
        self.valtype = self.constructor(type_book, value_type)
        self.aformat = self.constructor(format_book, arc_format)
        self.colom_formated = str(self.aformat[0][0]) + self.colom + str(self.aformat[0][1])

    def statement(self):
        temp_state = []
        connector = "'OR' "
        count_values = len(self.values)
        if count_values == 0:
            return("error, not enough values...")
        else:
            for v in self.values:
                x = self.colom_formated + " = " + str(self.valtype[0][0]) + v + str(self.valtype[0][1]) + ' ' + connector
                temp_state.append(str(x))
        state = "".join(temp_state)[:-5]              
        return(str(state))

    def constructor(self, book, book_key):
        return([v for k,v in book.iteritems() if k==book_key])

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

Ваш первый вопрос лучше задать на сайте codereview .

Что касается вашего второго вопроса, вы можете использовать генератор следующим образом:

def constructor(self, book, book_key):
    for k, v in book.iteritems():
        if k==book_Key:
            yield v

...

for value in obj.constructor(book ,book_key):
    # Do whatever you need with value

Во всяком случае, я понимаю, что вы получите только один результат от понимания списка, в таком случае:

def constructor(self, book, book_key):
    return next(v for k, v in book.iteritems() if k==book_key, None)

...

value = obj.constructor(book ,book_key)
if value is not None:
    # Do whatever you need with value

Где next - это встроенная функция, которая возвращает следующее значение итератора или значение по умолчанию, переданное (None в этом случае), если итератор исчерпан (если значение по умолчанию не установлено прошло, исключение будет возбуждено в этом случае).

3 голосов
/ 27 февраля 2012

Вы можете легко изменить свое понимание списка в генератор, просто поменяв [] на (), чтобы сделать его генератором, и поменяв return на ключевое слово генератора yield:

yield (k,v in book.iteritems() if k==book_key)

Теперь должен возвращаться только один кортеж - если вы хотите больше (в виде списка), вам нужно позвонить list(constructor()).

1 голос
/ 27 февраля 2012
def constructor(self, book, book_key):
    return([v for k,v in book.iteritems() if k==book_key])

Если book - словарь, его ключи являются уникальными. Так зачем перебирать этот диктат, чтобы найти значение?

Почему бы и нет:

def constructor(self, book, book_key):
    return (book[book_key],)
...