То же значение из интерактивной оболочки
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)
....