How to make a variable's late binding crosses the module boundary?

Chris Angelico rosuav at gmail.com
Mon Aug 29 01:58:22 EDT 2022


On Mon, 29 Aug 2022 at 15:54, Jach Feng <jfong at ms4.hinet.net> wrote:
>
> Richard Damon 在 2022年8月29日 星期一上午10:47:08 [UTC+8] 的信中寫道:
> > On 8/27/22 7:42 AM, Mark Bourne wrote:
> > > Jach Feng wrote:
> > >> I have two files: test.py and test2.py
> > >> --test.py--
> > >> x = 2
> > >> def foo():
> > >>      print(x)
> > >> foo()
> > >>
> > >> x = 3
> > >> foo()
> > >>
> > >> --test2.py--
> > >> from test import *
> > >> x = 4
> > >> foo()
> > >>
> > >> -----
> > >> Run test.py under Winows8.1, I get the expected result:
> > >> e:\MyDocument>py test.py
> > >> 2
> > >> 3
> > >>
> > >> But when run test2.py, the result is not my expected 2,3,4:-(
> > >> e:\MyDocument>py test2.py
> > >> 2
> > >> 3
> > >> 3
> > >>
> > >> What to do?
> > >
> > > `from test import *` does not link the names in `test2` to those in
> > > `test`.  It just binds objects bound to names in `test` to the same
> > > names in `test2`.  A bit like doing:
> > >
> > > import test
> > > x = test.x
> > > foo = test.foo
> > > del test
> > >
> > > Subsequently assigning a different object to `x` in one module does
> > > not affect the object assigned to `x` in the other module. So `x = 4`
> > > in `test2.py` does not affect the object assigned to `x` in `test.py`
> > > - that's still `3`.  If you want to do that, you need to import `test`
> > > and assign to `test.x`, for example:
> > >
> > > import test
> > > test.x = 4
> > > test.foo()
> > >
> > Yes, fundamental issue is that the statement
> >
> > from x import y
> >
> > makes a binding in this module to the object CURRECTLY bound to x.y to
> > the name y, but if x.y gets rebound, this module does not track the changes.
> >
> > You can mutate the object x.y and see the changes, but not rebind it.
> >
> > If you need to see rebindings, you can't use the "from x import y" form,
> > or at a minimum do it as:
> >
> >
> > import x
> >
> > from x import y
> >
> > then later to get rebindings to x.y do a
> >
> > y = x.y
> >
> > to rebind to the current x.y object.
> >
> > --
> > Richard Damon
> Yes, an extra "import x" will solve my problem too! Sometimes I am wondering why "from x import y" hides x? hum...can't figure out the reason:-)
>

"from x import y" doesn't hide x - it just grabs y. Python does what
you tell it to. :)

ChrisA


More information about the Python-list mailing list