Может ли Python иметь обозначение числа на основе суффикса для инженерных целей? - PullRequest
6 голосов
/ 19 марта 2011

Как инженер-электрик я (мы?) Использую python для помощи в расчетах / автоматизации / и т. Д.

При работе с вычислениями с использованием некоторых реальных чисел ОЧЕНЬ принято думать -nano, -pico, -tera и т. Д.

Например: я знаю, что такое конденсатор емкостью 1 пФ, но конденсатор емкостью 1e-12 F несколько менее дружественен. Кроме того, он в 4 раза больше печатает ( 1p против 1e-12 ) и более подвержен ошибкам. Нельзя сказать, что при отображении чисел суффикс числа просто проще.

Итак, вопрос: возможно ли, чтобы это работало в python (IPython?):

L = 1n
C = 1p
f = 1/(2*pi*sqrt(L*C))
print(f) gives: 5.033G (or whatever the accuracy should be)

Это было бы невероятно полезно и просто как калькулятор!

Спасибо.

UPDATE: Я ищу не обработку единиц , а обработку с суффиксами чисел . Так что не волнует, фарад это или килограмм, но ДЕЙСТВИТЕЛЬНО заботьтесь о суффиксе (-n, -u, -m, -M, -G ...)

Ответы [ 4 ]

3 голосов
/ 19 марта 2011

Вы можете создать модуль со всеми необходимыми единицами измерения в виде символов, скажем unit.py, содержащий что-то вроде

pico = 1*e-12
nano = 1*e-9
micro = 1*e-6
mili = 1*e-3 

Farad = 1

pF = pico*Farad
nF = nano*Farad

, тогда в коде 50 пФ в Фарадах будет

units
50*units.pF
3 голосов
/ 19 марта 2011

Конечно. Просто напишите свой собственный анализатор и сгенерируйте свой собственный AST с помощью языковых служб Python .

1 голос
/ 19 марта 2011

Примеры, включенные в pyparsing, включают в себя простой синтаксический анализатор выражений, который называется fourFn.py .Я адаптировал его для принятия ваших суффиксальных литералов с примерно 8 строками дополнительного кода, найдите его здесь .Это изменение поддерживает стандартные суффиксы , за исключением «da» для 1e1, поскольку я ограничился использованием одиночных символов, вместо этого я использовал «D».

Если вы хотите сделатьэто в интерактивный калькулятор, вы можете адаптировать представление Стивена Сьюва , используя те же изменения, которые я внес в fourFn.py.

1 голос
/ 19 марта 2011

Не имеет большого смысла вводить сложность в языке для чего-то, что может быть просто решено с помощью правильного именования и функций:

L_nano = unit_nano(1)
C_pico = unit_pico(1)
f = 1/(2*pi*sqrt(L*C))

print(to_Giga(f)) gives: 5.033G 
...