как я делаю этот код Python менее ужасным

В первую очередь, Python является потрясающим языком. Это - мой первый проект с помощью Python, и я уже сделал смешное количество прогресса.

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

class Course:

    crn =  course =  title =  tipe =  cr_hours =  seats =  instructor =  days =  begin =  end = location = exam = ""

    def __init__(self, pyQueryRow):
        self.crn = Course.get_column(pyQueryRow, 0)
        self.course = Course.get_column(pyQueryRow, 1)
        self.title = Course.get_column(pyQueryRow, 2)
        self.tipe = Course.get_column(pyQueryRow, 3)
        self.cr_hours = Course.get_column(pyQueryRow, 4)
        self.seats = Course.get_column(pyQueryRow, 5)
        self.instructor = Course.get_column(pyQueryRow, 6)
        self.days = Course.get_column(pyQueryRow, 7)
        self.begin = Course.get_column(pyQueryRow, 8)
        self.end = Course.get_column(pyQueryRow, 9)
        self.location = Course.get_column(pyQueryRow, 10)
        self.exam = Course.get_column(pyQueryRow, 11)

    def get_column(row, index):
        return row.find('td').eq(index).text()

Спасибо!

8
задан Matthew Flaschen 7 July 2010 в 07:09
поделиться

4 ответа

def__init__(self, pyQueryRow):
    for i,attr in enumerate("crn course title tipe cr_hours seats instructor"
                            " days begin end location exam".split()):
        setattr(self, attr, self.get_column(pyQueryRow, i))

Этот способ позволяет избежать многократных вызовов self.get_column

def__init__(self, pyQueryRow):
    attrs = ("crn course title tipe cr_hours seats instructor"
             " days begin end location exam".split())
    values = [td.text for td in pyQueryRow.find('td')]
    for attr, value in zip(attrs, values):
        setattr(self, attr, value)
14
ответ дан 5 December 2019 в 07:34
поделиться

Лично я бы использовал словарь, чтобы сопоставить свойство с номерами столбцов:

class Course:

    crn =  course =  title =  tipe =  cr_hours =  seats =  instructor =  days =  begin =  end = location = exam = ""

    def __init__(self, pyQueryRow):
        course_row_mapping = {
            'crn' : 0,
            'course' : 1,
            'title' : 2,
            'tipe' : 3, # You probably mean "type"?
            'cr_hours' : 4,
            'seats' : 5,
            'instructor' : 6,
            'days' : 7,
            'begin' : 8,
            'end' : 9,
            'location' : 10,
            'exam' : 11,
        }   

        for name, col in course_row_mapping.iteritems():
            setattr(self, name, Course.get_column(pyQueryRow, col))

    def get_column(row, index):
        return row.find('td').eq(index).text()
4
ответ дан 5 December 2019 в 07:34
поделиться

Я не уверен, что есть "лучший" способ. То, что у вас есть, конечно, вполне читаемо. Если вы хотите избежать дублирования кода Course.get_column , вы можете определить для этого лямбду, как в ответе Мэтью Флашена, например.

class Course:
    def __init__(self, pyQueryRow):
        get_column = lambda index: pyQueryRow.find('td').eq(index).text()

        self.crn = get_column(0)
        self.course = get_column(1)
        self.title = get_column(2)
        self.tipe = get_column(3)
        self.cr_hours = get_column(4)
        self.seats = get_column(5)
        self.instructor = get_column(6)
        self.days = get_column(7)
        self.begin = get_column(8)
        self.end = get_column(9)
        self.location = get_column(10)
        self.exam = get_column(11)

Обратите внимание, что вам не нужна строка, которая инициализирует все поля заранее - достаточно просто установить их в __ init __ . Edit: на самом деле, как говорит Мэтью, это устанавливает поля класса, а не поля экземпляра - я полностью пропустил это.

2
ответ дан 5 December 2019 в 07:34
поделиться

РЕДАКТИРОВАТЬ: На самом деле, лучше всего:

self.crn, self.course, self.title, self.tipe, self.cr_hours, self.seats,\ 
self.instructor, self.days, self.begin, self.end, self.location, self.exam = \ 
[pq(td).text() for td in pyQueryRow.find('td')]

Предполагается, что вы импортировали PyQuery как pq. Это позволяет вообще избежать использования индексов.


self.crn, self.course, self.title, self.tipe, self.cr_hours, self.seats,\ 
self.instructor, self.days, self.begin, self.end, self.location, self.exam = \
map(lambda index: get_column(pyQueryRow, index), xrange(0, 12))

или, если вам нужно понимание списка:

self.crn, self.course, self.title, self.tipe, self.cr_hours, self.seats,\ 
self.instructor, self.days, self.begin, self.end, self.location, self.exam = \
[get_column(pyQueryRow, index) for index in xrange(0, 12)]

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

Также удалите crn = course = . Вы назначаете класс, а не экземпляр.

2
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: