То же значение из интерактивной оболочки

def unittest(execute=False):
                with timetravel(datetime(2017,03,01)) as now:
                    loan2 = compute_loan(user, {'product_id': 1,
                                       'frequency': '1week',
                                       'first_debit_date': now })

            if not execute:
                print('You are wrong')
                pass
            else:
                field_list = CustomerProduct._meta.get_fields()
                mylist = []
                exclude = ['id','contract', 'actor_actions',
                        'locked', 'description', 'target_actions',
                        'action_object_actions', 'created', 'modified',
                        'request', 'withdrawal_first_date', 'deposit_date']
                table = Texttable(max_width = 6000)
                for field in field_list:
                    if field.name not in exclude:
                        mylist.append([field.name, getattr(loan2.request.customer_product, field.name)])
                table.add_rows(mylist)
                print(table.draw())

С помощью этой функции я создал список, содержащий field.name а также getattr(loan2.request.customer_product, field.name), Например,

+----------------------------------------------------+---------+
| debit_frequency                                    | 1week   |
+----------------------------------------------------+---------+
| broker_pmt                                         | 17.865  |
+----------------------------------------------------+---------+
| broker_pre_withdrawal_daily_interest_rate          | 0.001   |
+----------------------------------------------------+---------+
| broker_total_post_pre_withdrawal_interest_amount   | 139.908 |
+----------------------------------------------------+---------+

Проблема в том, что я предпочитаю что-то вроде

+----------------------------------------------------+-----------------+
| debit_frequency                                    | u'1week'        |
+----------------------------------------------------+-----------------+
| broker_pmt                                         | 17.865903434    |
+----------------------------------------------------+-----------------+
| broker_pre_withdrawal_daily_interest_rate          | 0.0014348934    |
+----------------------------------------------------+-----------------+
| broker_total_post_pre_withdrawal_interest_amount   | 139.9083498304  |
+----------------------------------------------------+-----------------+

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

In [7]: loaner.request.customer.sum_new_pmt
Out[7]: 56.000121522936645

Я хотел бы получить возвращаемое значение из интерактивной оболочки. Может ли кто-нибудь помочь мне с этим вопросом? Что я мог бы изменить в коде?

Спасибо!

PS Пожалуйста, дайте мне знать, если вопрос неясен.

2 ответа

Решение

(Расширяю мои комментарии)
Во-первых, я бы посоветовал не печатать результаты ваших тестов так, как вы показываете. Есть несколько тестовых модулей для Python; мой выбор был бы Pytest.

Поскольку преобразование из строк в число с плавающей точкой не всегда дает точное значение, соответствующее строке (поскольку двоичная плавающая точка не может точно представлять значение), при сравнении чисел с плавающей точкой лучше избегать сравнения на равенство, но разрешать какая-то комната для маневра. Мое предложение было использовать round (или эквивалентно, форматирование строки с определенной точностью) для этого - например, assert round(139.908, 3) == round(computed_value, 3),

Каков наилучший способ сравнения чисел с плавающей точкой на почти равенство в Python? хорошее объяснение проблем с некоторым полезным кодом.

В соответствии с исходным кодом TextTable здесь https://github.com/foutaise/texttable/blob/master/texttable.py Кажется, вы должны использовать что-то вроде этого

....
table = Texttable(max_width = 6000)
table.set_precision(20)
....
Другие вопросы по тегам