I am having issues with using function generators in python, i.e. returning functions from a function, where some of the inputs are defined via the outer function's arguments, yielding a function with lower arity. I have used this method before in other cases without issue but I have run into an error in this case and haven't been able to understand the reason. I have the following function that produces a function:
def func1(s: set, f: Callable) -> Callable:
def func2(x: int) -> dict:
while x:
s = s - {x}
x = f(x)
return s
return func2
f2 = func1({1,2,3,4}, lambda x: x-1)
If I try f2(3)
, I get the error "local variable 's' referenced before assignment"
related to the s = s - {x}
statement. I don't understand why s
is not part of the scope since I assumed it was fixed when func1
was called to create f2
.
I was able to fix this issue by instead using this method: I combine all the arguments into one function, say func3
and use the functools.partial
operation, which behaves as expected:
from functools import partial
def func3(x: int, s: set, f: Callable) -> dict:
while x:
s = s - {x}
x = f(x)
return s
f2 = partial(func3, s={1,2,3,4}, f=lambda x: x-1)
When I call f2(3)
I get {4}
as expected.
My understanding is that both of these approaches should yield the same result; however, I am apparently missing something about how variable scope operates in the first case. Any insight would be greatly appreciated.