Python: избегая упрощения дроби - PullRequest
3 голосов
/ 19 мая 2010

Я работаю над музыкальным приложением на Python и хотел бы использовать модуль фракций для обработки временных подписей среди прочего. Моя проблема в том, что дроби упрощаются, т.е.

>>> from fractions import Fraction
>>> x = Fraction(4, 4)
>>> x
Fraction(1, 1)

Однако с музыкальной точки зрения важно, чтобы 4/4 оставалось 4/4, даже если оно равно 1. Есть ли какой-нибудь встроенный способ избежать такого поведения?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 19 мая 2010

Да: создайте для него специальный класс.

Подписи музыкального времени не являются дробными, поэтому нет смысла представлять их классом математики.

3 голосов
/ 19 мая 2010

Вы должны использовать некоторую структуру данных, отличную от Fraction. Простой кортеж был бы самым простым, хотя вы могли бы также создать свой собственный класс. Если вам нужно выполнить вычисления, делайте их по отдельным целым числам, составляющим временную подпись.

0 голосов
/ 03 июня 2010

Нет, нет & ndash; деление на GCD встроено в операции класса Fraction. Другие причины, по которым вы, возможно, захотите создать пользовательский класс в любом случае, по крайней мере, если вы работаете с музыкальной нотацией, это:

  • , чтобы иметь возможность обрабатывать замены общего времени (C) и сокращения времени (косая черта) для 4/4 и 2/4 & ndash; или даже лучше, чтобы сделать это необязательным
  • чтобы иметь возможность представлять составные временные подписи (например, 2 + 3 + 2/8)
...