So this involves a maybe unusual chain of things:
A.py
from B import call
def make_call():
print("I'm making a call!")
call(phone_number="867-5309")
B.py
def call(phone_number):
pass
test_A.py
import pytest
from A import make_call
@pytest.fixture
def patch_A_call(monkeypatch):
number = "NOT ENTERED"
number_list = []
def call(phone_number):
nonlocal number
number = phone_number
number_list.append(phone_number)
monkeypatch.setattr("A.call", call)
return (number, number_list)
def test_make_call(patch_A_call):
make_call()
print(f"number: {patch_A_call[0]}")
print(f"number_list: {patch_A_call[1]}")
What's printed is:
number: NOT ENTERED
number_list: [867-5309]
I expected "867-5309" to be the value for both results.
I know that lists are passed by reference in Python—but I assumed that the nonlocal
declaration would pass the variable along down the chain.
Why doesn't it work this way?