Remembering the context

G

GZ

Hi All,

I am looking at the following code:

def fn():

def inner(x):
return tbl[x]

tbl={1:'A', 2:'B'}
f1 = inner # I want to make a frozen copy of the values of tbl
in f1
tbl={1:'C', 2:'D'}
f2 = inner
return (f1,f2)

f1,f2 = fn()
f1(1) # output C
f2(1) # output C

What I want is for f1 to make a frozen copy of tbl at the time f1 is
made and f2 to make another frozen copy of tbl at the time f2 is made.
In other words, I want f1(1)=='A' and f2(1)=='C'.

One way to do this is to use functools.partial

def fn():

def inner(tbl, x):
return tbl[x]

tbl={1:'A', 2:'B'}
f1 = functools.partial(inner,tbl) # I want to make a frozen copy
of the values of tbl in f1
tbl={1:'C', 2:'D'}
f2 = functools.partial(inner,tbl)
return (f1,f2)

I am wondering if there is any other way to do this.
 
C

Chris Rebert

I am looking at the following code:

def fn():

   def inner(x):
        return tbl[x]

   tbl={1:'A', 2:'B'}
   f1 = inner   # I want to make a frozen copy of the values of tbl
in f1
   tbl={1:'C', 2:'D'}
   f2 = inner
  return (f1,f2)

f1,f2 = fn()
f1(1)  # output C
f2(1) # output C

What I want is for f1 to make a frozen copy of tbl at the time f1 is
made and f2 to make another frozen copy of tbl at the time f2 is made.
In other words, I want f1(1)=='A' and f2(1)=='C'.

One way to do this is to use functools.partial

def fn():

   def inner(tbl, x):
        return tbl[x]

   tbl={1:'A', 2:'B'}
   f1 = functools.partial(inner,tbl)   # I want to make a frozen copy
of the values of tbl in f1
   tbl={1:'C', 2:'D'}
   f2 = functools.partial(inner,tbl)
  return (f1,f2)

I am wondering if there is any other way to do this.

I prefer the functools.partial() method personally, but the other
obvious way to go about it is:

def fn():
tbl={1:'A', 2:'B'}
f1 = lambda x, table=tbl: table[x]

tbl={1:'C', 2:'D'}
f2 = lambda x, table=tbl: table[x] # we have to be repetitive

return (f1,f2)

Note that default argument values are evaluated exactly once, at
definition-time.
The lambdas can equivalently be replaced with def-s of course.

Cheers,
Chris
 
J

Jean-Michel Pichavant

GZ said:
Hi All,

I am looking at the following code:

def fn():

def inner(x):
return tbl[x]

tbl={1:'A', 2:'B'}
f1 = inner # I want to make a frozen copy of the values of tbl
in f1
tbl={1:'C', 2:'D'}
f2 = inner
return (f1,f2)

f1,f2 = fn()
f1(1) # output C
f2(1) # output C

What I want is for f1 to make a frozen copy of tbl at the time f1 is
made and f2 to make another frozen copy of tbl at the time f2 is made.
In other words, I want f1(1)=='A' and f2(1)=='C'.

something like

def makeInner(a_tbl):
def inner(x):
return a_tbl[x]
return inner

def fn():
tbl = {1:'A', 2:'B'}
f1 = makeInner(tbl)
tbl = {1:'C', 2:'D'}
f2 = makeInner(tbl)
return f1,f2

f1,f2 = fn()

In [4]: print f1(1)
A

In [5]: print f2(1)
C

JM

PS : smelling code anyway :eek:)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,832
Latest member
UtaHetrick

Latest Threads

Top