Как назначить функцию другой функции в одном файле скрипта Python? - PullRequest
0 голосов
/ 28 марта 2019

Я могу сделать это, если заключу их в класс Python:

class Foo:

    def generate_list(self):
        my_list = [3, 4, 5, 6]
        return my_list

    def get_first_list(self):
        lists = self.generate_list()
        first = lists[0]
        return first

class TestFoo:

    def fake_generate_list(self):
        return [10, 11]

    def test_get_first_list(self):
        foo = Foo()
        foo.generate_list = self.fake_generate_list # <----
        first = foo.get_first_list()
        assert first == 10 # PASSED (first is 10)

Но это не удастся, если я разверну их без класса:

def generate_list():
    print(generate_list)
    my_list = [3, 4, 5, 6]
    return my_list

def get_first_list():
    lists = generate_list()
    first = lists[0]
    return first

# Test

def fake_generate_list():
    return [10, 11]

def test_get_first_list():
    generate_list = fake_generate_list # <------
    first = get_first_list()
    assert first == 10 # FAILED (first still 3)

Я знаю, что одна альтернатива использует monkeypatch.setattr("myfilename.generate_list", fake_generate_list). Но это Есть какая-то простая альтернатива, такая как old_function = fake_function.

Спасибо

1 Ответ

0 голосов
/ 28 марта 2019

test_get_first_list generate_list - это новая локальная переменная, а не присвоение функции generate_list, поэтому она не видна внутри get_first_list. Вы можете написать global generate_list вверху test_get_first_list, тогда вы назначаете функцию, как вы и предполагали.

def test_get_first_list():
    global generate_list
    generate_list = fake_generate_list
    first = get_first_list()
    assert first == 10

Это быстро приведет к написанию плохого / не поддерживаемого кода. См. Например [ здесь ].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...