Любой способ улучшить эту функцию Python? - PullRequest
1 голос
/ 30 июня 2010
def __number():
    # This line returns the number of the latest created object
    # as a "Factura" object in format "n/year"
    last = Factura.objects.filter(f_type__exact=False).latest('number')

    # We convert it into a string and split it to get only the first number
    spl = str(last).split('/')[0]

    # Convert it into integer so we can do math
    n = int(spl)

    # Get the current year
    y = date.today().strftime('%y')

    # If none return 1/year
    if n == None:
        return str(1) + '/' + str(y)

    # Else we increment the number in one.
    else:
        n = n + 1
        return str(n) + '/' + str(y)

Что он делает: Он автоматически генерирует число в формате «1 / год», «2 / год» и т. Д. Если пользователь вводит другой номер, pe 564/10, функция следует за ним, и следующим будет 565/10.

Даже если пользователь вводит pe 34/10 после ввода с 564/10, функция будет следовать за наибольшим числом.

Правильно ли я это сделал или есть лучший способсделать это?


Обновление:

def __number():
    current_year = date.today().strftime('%y')
    try:
        facturas_emmited = Factura.objects.filter(f_type__exact=False)
        latest_object = facturas_emmited.latest('number').__str__()
        first_number = int(latest_object.split("/")[0]) + 1
    except Factura.DoesNotExist:
        first_number = 1
    return '%s/%s' % (first_number, current_year)

Ответы [ 3 ]

2 голосов
/ 01 июля 2010

Это действительно только начало, но я бы начал с замены некоторых комментариев самодокументированным кодом.

def __number():
    # "Factura" object in format "n/year"
    latest_object = Factura.objects.filter(f_type__exact=False).latest('number')

    # Better name can be available if you explain why the first number is important and what it means
    # Do Factura objects not have a __repr__ or __str__ method that you must cast it?
    first_number = int(str(latest_object).split('/')[0])
    current_year = date.today().strftime('%y')
    # Use "is None" rather than "== None"
    if first_number is None:
        return '1/%d' % current_year
    # No else needed because of return above
    # Why do we add 1 to first number? Comments should explain _why_, not how
    return '%d/%d' % (first_number + 1, current_year)
1 голос
/ 01 июля 2010

Может last быть None? Если это так, было бы хорошо проверить это:

# get last as before

if last:
    n = int(str(last).split("/")[0]) + 1
else:
    n = 1

# get y as before

return str(n) + "/" + str(y)

Еще одним улучшением является то, что вы строите строку результата только в одном месте.

Я не знаю, что такое объект Factura, но разве вы не можете получить значение n, вызвав какой-нибудь метод для него? Это было бы лучше, чем преобразовать его в строку, разделить и взять последнюю часть.

0 голосов
/ 01 июля 2010

Я решил подобную проблему некоторое время назад, используя object.id/year (где object / id - это идентификатор базы данных).

Это гарантирует, что это будет уникальным, автоинкрементным (вам не нужно делатьn = n + 1, что теоретически может привести к дублированию значений в дБ).

Вы можете сделать это путем переопределения метода save, и единственная хитрость заключается в том, что вам сначала нужно сохранить объект (идентификатор назначен) изатем создайте id / номер года и сохраните снова (возможно, есть лучший способ сделать это, чем двойное сохранение).

def save(self, force_insert = False, force_update = False):
    super(Factura, self).save(force_insert, force_update)
    current_year = date.today().strftime('%y')
    self.identifier = '%s/%s'%(self.id, current_year)
    super(Factura, self).save(force_insert, force_update)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...