Переменная списка используется в функции, когда она кажется пустой - PullRequest
0 голосов
/ 07 апреля 2020

Я создаю приложение Frappe , аналогичная ( рабочая ) функциональность существует, поэтому я пытаюсь повторно использовать этот код. Я не могу найти фактическое назначение для переменной lst в этом документе python (используя поиск, это локальная переменная для этой функции). Пока он выглядит как пустой список при объявлении, однако он обрабатывается так, как если бы он содержал значение.

Или я просто неправильно понимаю сам код?

сначала объявлено lst в виде списка (пусто)

lst = []

Это назначено для recciled_entry (все еще пусто)

reconciled_entry = lst

Затем оно используется следующим образом: (еще пусто)

if lst:
        reconcile_against_document(lst)

Функция Функция reconcile_against_document ожидает фактический список:

Это все еще пусто ???

def reconcile_against_document(args):
    """
        Cancel JV, Update against document, split if required and resubmit jv
    """
    for d in args:

        check_if_advance_entry_modified(d)
        validate_allocated_amount(d)

        # cancel advance entry
        doc = frappe.get_doc(d.voucher_type, d.voucher_no)

        doc.make_gl_entries(cancel=1, adv_adj=1)
...

Основная функция:

def reconcile(self, args):
        for e in self.get('payments'):
            e.invoice_type = None
            if e.invoice_number and " | " in e.invoice_number:
                e.invoice_type, e.invoice_number = e.invoice_number.split(" | ")

        self.get_invoice_entries()
        self.validate_invoice()
        dr_or_cr = ("credit_in_account_currency"
            if erpnext.get_party_account_type(self.party_type) == 'Receivable' else "debit_in_account_currency")

        lst = []
        dr_or_cr_notes = []
        for e in self.get('payments'):
            reconciled_entry = []
            if e.invoice_number and e.allocated_amount:
                if e.reference_type in ['Sales Invoice', 'Purchase Invoice']:
                    reconciled_entry = dr_or_cr_notes
                else:
                    reconciled_entry = lst

                reconciled_entry.append(self.get_payment_details(e, dr_or_cr))

        if lst:
            reconcile_against_document(lst)

        if dr_or_cr_notes:
            reconcile_dr_cr_note(dr_or_cr_notes)

        msgprint(_("Successfully Reconciled"))
        self.get_unreconciled_entries()

1 Ответ

0 голосов
/ 07 апреля 2020

Хорошо, я получил некоторую помощь по электронной почте.

Python назначение объекта забавно. Насколько я понимаю, когда lst (объект) назначается другой переменной (new_lst, которая также становится переменной объекта), то, что происходит с одной переменной объекта, влияет на другую

python demo screenshot

>>> lst = []
>>> new_lst = lst
>>> new_lst.append('funny python')
>>> lst
['funny python']
>>> lst.append('not funny python')
>>> new_lst
['funny python', 'not funny python']
>>> lst
['funny python', 'not funny python']
...