покрытие условия в Python

Вы можете довольно легко распечатать символ квадратного корня, используя LaTex в maplotlib, т.е.

s = 2
plt.plot(x, y, label=r'$\sqrt{{{}}} 

Сложная часть, конечно, использует правильные коэффициенты и корни, это проще, если вы используете немного другой подход к генерации x, что-то вроде этого

import matplotlib.pyplot as plt
import numpy as np

E = np.linspace(50000,200000,1000) # eV

a = 3.615*10**(-10) #m
h = 6.582*10**(-16) #eV s
m = 9.109*10**(-31) #kg
J = 6.242*10**(-18) #1eV to J

def T(x,E):
    return np.arcsin(x*np.sqrt(J*((np.pi**2 *h**2)/(a**2 * 4*m *E))))*1000

fig, ax = plt.subplots()
k = [(2, 2), (2, 1), (1, 3)]
x = list()
labels = list()
for i in range(len(k)):
    x.append(k[i][0] * np.sqrt(k[i][1]))
    if k[i][0] == 1 and k[i][1] != 1:
        labels.append(r'hkl=$\sqrt{{{}}} 

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][1])) elif k[i][0] != 1 and k[i][1] == 1: labels.append(r'hkl=${{{}}}

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][0])) elif k[i][0] != 1 and k[i][1] != 1: labels.append(r'hkl=${{{}}}\sqrt{{{}}}

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][0], k[i][1])) else: labels.append('hkl=1') for i in range(len(x)): ax.plot(E,T(x[i],E),label=labels[i]) plt.ylabel('$\Theta$ (mrad)') plt.xlabel('Energy (eV)') plt.legend(bbox_to_anchor=(0.99, 0.98), loc=1, borderaxespad=0.)

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(s))

Сложная часть, конечно, использует правильные коэффициенты и корни, это проще, если вы используете немного другой подход к генерации x, что-то вроде этого

import matplotlib.pyplot as plt
import numpy as np

E = np.linspace(50000,200000,1000) # eV

a = 3.615*10**(-10) #m
h = 6.582*10**(-16) #eV s
m = 9.109*10**(-31) #kg
J = 6.242*10**(-18) #1eV to J

def T(x,E):
    return np.arcsin(x*np.sqrt(J*((np.pi**2 *h**2)/(a**2 * 4*m *E))))*1000

fig, ax = plt.subplots()
k = [(2, 2), (2, 1), (1, 3)]
x = list()
labels = list()
for i in range(len(k)):
    x.append(k[i][0] * np.sqrt(k[i][1]))
    if k[i][0] == 1 and k[i][1] != 1:
        labels.append(r'hkl=$\sqrt{{{}}} 

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][1])) elif k[i][0] != 1 and k[i][1] == 1: labels.append(r'hkl=${{{}}}

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][0])) elif k[i][0] != 1 and k[i][1] != 1: labels.append(r'hkl=${{{}}}\sqrt{{{}}}

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

.format(k[i][0], k[i][1])) else: labels.append('hkl=1') for i in range(len(x)): ax.plot(E,T(x[i],E),label=labels[i]) plt.ylabel('$\Theta$ (mrad)') plt.xlabel('Energy (eV)') plt.legend(bbox_to_anchor=(0.99, 0.98), loc=1, borderaxespad=0.)

Это займет любые значения для построения x и печати квадратно-корневых символов по желанию (хотя я уверен, что есть лучшие способы сделать это)

Latex Square Root

19
задан SilentGhost 24 March 2009 в 12:52
поделиться

6 ответов

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

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

Короткий ответ заключается в том, что в объектно-ориентированном мире вы должны использовать объекты и все хорошее, что с ними связано (инкапсуляция, полиморфизм)

Полиморфизм

Если метод расчета расстояния между генами варьируется , вы должны примерно (более вероятно, Стратегия ) иметь класс гена для каждого варианта. Инкапсулируйте то, что меняется. В противном случае вы получите несколько «если».

Open For Extension, Закрыт для модификации

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

В этом случае вам следует добавить новый класс Gene, а не изменять код, написанный в #geneDistance

Скажите, не спрашивайте

Вы должны сообщить своим объектам что делать, а не спрашивать их состояние и принимать решения за них. Внезапно вы нарушаете принцип единственной ответственности , поскольку это полиморфизм.

Тестируемость

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

9
ответ дан 30 November 2019 в 05:04
поделиться

Вы ищете цикломатическую сложность (Википедия)? Это в основном вычисляет количество путей через часть кода. Существуют некоторые проекты вычислить это для кода Python, например, PyMetrics или этот. Google, конечно, поднимет больше.

Но я не знаю о дальнейшей интеграции с модульными тестами, которые покажут Вам покрытие.

1
ответ дан 30 November 2019 в 05:04
поделиться

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

Например,

raise SomeException(x)

Покрытие ответвления для этого должно проверить, что SomeException (x) полностью инстанцировали и не повысил его собственное исключение.

assert x, "Oh No!: %r" % (x, y)

Это должно проверить, что текст на правой стороне оператора контроля полностью оценен.

return args.name or os.getenv("NAME") or die("no name present")

Каждый из первых двух сроков должен быть проверен на истинный/ложный путь, но не последнее. На самом деле последнее даже не могло бы возвратиться.

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

Если Вы хотите попробовать этот маршрут, запустите с Python 2.6 или 3.0. В тех выпусках документируется модуль AST, и можно создать собственные узлы AST прежде, чем сгенерировать код или .pyc файл.

2
ответ дан 30 November 2019 в 05:04
поделиться

Я не использовал его сам, но если Вы готовы заменить анализ покрытия тестированием мутации, я услышал о позвонившем тестере мутации, "пристают".

В то время как я делал поиск с помощью Google, я также столкнулся со списком инструментов тестирования Python, который упоминает некоторые возможные инструменты покрытия кода.

2
ответ дан 30 November 2019 в 05:04
поделиться

У того же самого специалиста по обслуживанию coverage.py есть статья, обсуждая способ получить информацию покрытия на уровне байт-кода. Метод является небольшим kludgey: это включает повторную сборку .pyc файлы с настроенными номерами строки. Однако это обеспечивает почти столько гранулярности в измерении покрытия, сколько Вы могли попросить.

1
ответ дан 30 November 2019 в 05:04
поделиться

Анализировать и изменять AST - это правильный ответ, ИМХО. См. Этот документ для полного описания того, что вам нужно сделать: «Легкое покрытие ветвей для произвольных языков»

http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

0
ответ дан 30 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: