Ваш патч должен читать @patch('module.file2.f1.method_1')
Я расскажу вам, почему:
test_determine_failure_modes.py
импортирует file1 as f1
. Затем file1
читается, и он определяет method1
в своих локальных. Это становится доступным на символе f1
.
Итак, таблицы символов выглядят следующим образом:
file1: {'method1': , , ...}
f1: {'method1': , , ...}
Затем вы исправляете file1.method1
и получаете эту таблицу символов
file1: {'method1': , MOCK, ...}
f1: {'method1': , , ...}
Затем вы вызываете f1.method1
и получаете фактический функция.
Похоже, вы используете method_dict
для ссылки на функцию, поэтому вам все же нужно немного углубиться. К счастью, в unittest.mock.patch
есть утилита для насмешки содержимого диктов, например:
with patch.dict(f2.method_dict, {'method1': your_mock_here}):
your_test_here()
Еще один способ - отложить разрешение имени метода до того, как он будет смоделирован.
method_dict = {
'method_1' : lambda data: f1.method1(data),
'method_2' : lambda data: f1.method2(data),
'method_3' : lambda data: f1.method3(data)
}
Здесь, поиск для f1.method1 не происходит до тех пор, пока он не будет проверен. В предыдущем случае вы помещаете ссылку на функцию, когда file2 был прочитан. Здесь ссылка не разрешается, пока метод не будет вызван.
A немного менее грубым подходом будет перечисление всех подгрупп индекса n, как предложил Il-Bhima, а затем для каждой подгруппы отметьте каждый x i * x j -1 до посмотрите, содержится ли оно в подгруппе.
Элементы x1, ...,
Единственное решение, которое я могу придумать, это наивно. В основном, если у вас есть элементы Это все, что я мог придумать. Мне было бы очень интересно, если бы вы предложили лучший подход. x1, ..., xn
, вы бы использовали LowIndexSubgroupsFpGroup
GAP для перечисления всех подгрупп с индексом n (исключая те, у которых индекс
Вы пытаетесь определить, существует ли такая подгруппа H группы G, что {g 1 , ..., g n } является трансверсалью смежных классов H. т. е. множеством представителей разбиения G смежными классами H.
Во-первых, по теореме Лагранжа | G | = | G: H | * | G |, где | G: H | = | G | / | H | является индексом подгруппы H группы G. Если {g 1 , ..., g n } действительно трансверсаль, то | G: H | = | {g 1 , ..., g n } |, поэтому первый тест в вашем алгоритме должен заключаться в том, делит ли n | G |.
Более того, поскольку g i и g j находятся в одном правом смежном классе, только если g i g j -1 находится в H, затем вы можете проверить подгруппы с индексом n, чтобы увидеть, избегают ли они g i g j -1 . Также обратите внимание, что (g i g j -1 ) (g j g k -1 ) = g i g k -1 , поэтому вы можете выбрать любую пару g i s.
Этого должно быть достаточно, если n мала по сравнению с | G |.
Другой подход состоит в том, чтобы начать с H, являющейся тривиальной группой, и добавить элементы множества H * = {h в G: h k ! = g i g j -1 для всех i, j, k; i! = j} в генераторы H до тех пор, пока вы не сможете добавить больше (т.е. пока это не перестанет быть подгруппой). Тогда H является максимальной подгруппой G такая, что H является подмножеством H * . Если вы можете получить все такие H (и сделать их достаточно большими), то искомая подгруппа должна быть одной из них.
Этот подход будет лучше работать для больших n.
В любом случае неэкспоненциальный подход с временным интервалом не очевиден.
РЕДАКТИРОВАТЬ: Я только что нашел здесь обсуждение этой самой темы: http://en.wikipedia.org/wiki/Wikipedia:Reference_desk/Archives/ Mathematics / 2009_April_18 # Is_a_given_set_of_group_elements_a_set_of_coset_presentatives.3F