Как я могу получить поведение указателя типа в Python - PullRequest
0 голосов
/ 26 августа 2010

Я хочу написать контрольный пример, который будет проверять список функций.Вот пример того, что я хочу сделать:

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

## The testcase will then contain:
for func in method_list:
    func = Mock()
    # continue to setup the mock and do some testing

То, чего я хочу достичь, заключается в следующем:
Шаг 1) Назначьте мою локальную переменную метода каждому элементу в method_list
Шаг 2) Обезьяна патча по методу.В этом примере я использую объект mock.Mock

. На самом деле происходит следующее:
Шаг 1) метод успешно назначен элементу из списка method_list - ОК
Шаг 2) метод затем назначаетсяобъект Mock () - NOK

На шаге 2 я хотел получить элемент из method_list, например method1, который будет назначен объекту Mock ().Конечным результатом будет то, что и method, и method1 будут указывать на один и тот же объект Mock ()

Я понимаю, что по сути я делаю a = b
a = c
и затем ожидаю== b!

Я полагаю, что это невозможно, если не получить указатель на b?

Ответы [ 3 ]

1 голос
/ 26 августа 2010

Если я правильно вас понимаю, вы хотите изменить то, на что указывает переменная method1?Это правильно?

Вы можете сделать это, изменив запись в словаре локальных переменных:

for method_name in [ 'method1', 'method2' ]:
    locals()[ method_name ] = Mock( )

Причина, по которой ваш предыдущий код не делает то, что вам нужно, заключается в том, что func является ссылкой на функцию method1.Присваивая is, вы просто изменяете то, на что он указывает.

Вы уверены, что хотите это сделать?

Обезьянничье патчинг - это отвратительно и может вызвать много проблем.

1 голос
/ 26 августа 2010

Как-то так?

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

method_list=list(f for f in globals() if hasattr(globals()[f],'__call__') and f.startswith('method'))
print method_list
## The testcase will then contain:
for func in method_list:
    globals()[func] = Mock(func)
    # continue to setup the mock and do some testing

Хотя я не уверен, что это разумно.Похоже, что-то делать с декораторами.

1 голос
/ 26 августа 2010

Хм, а как насчет простого изменения method_list?

for i in range(len(method_list)): # xrange in Python 2
    method_list[i] = Mock()

То, что вы описываете, ближе к ссылкам на C ++, чем к указателям. Немногие языки имеют такую ​​семантику (некоторые предоставляют специальное ключевое слово для передачи по ссылке), включая Python.

...