On Thu, Apr 23, 2020 at 6:18 AM M.-A. Lemburg <m...@egenix.com> wrote:
>
> On 21.04.2020 15:51, Chris Angelico wrote:
> > On Tue, Apr 21, 2020 at 7:01 PM M.-A. Lemburg <m...@egenix.com> wrote:
> >> Instead of keeping values in local variables, you store
> >> them in the namespace object and because this knows about
> >> its attributes you can do a lot more in terms of introspection
> >> than what is possible when just relying on local variables
> >> in a function call context.
> >>
> >> See e.g. argparse's various namespace uses for an example
> >> in the stdlib.
> >>
> >
> >
> > Let me make things even clearer here. This is the entire code for the
> > index page handler.
> >
> > @app.route("/")
> > @app.route("/editor/<channelid>")
> > def mainpage(channelid=None):
> >     # NOTE: If we've *reduced* the required scopes, this will still
> > force a re-login.
> >     # However, it'll be an easy login, as Twitch will recognize the
> > existing auth.
> >     if "twitch_token" not in session or
> > session.get("twitch_auth_scopes") != REQUIRED_SCOPES:
> >         return render_template("login.html")
> >     user = session["twitch_user"]
> >     if channelid is None: channelid = user["_id"]
> >     try: channelid = str(int(channelid))
> >     except ValueError:
> >         # If you go to /editor/somename, redirect to /editor/equivalent-id
> >         # Bookmarking the version with the ID will be slightly faster, but
> >         # streamers will usually want to share the version with the name.
> >         users = query("helix/users", token=None, params={"login":
> > channelid})["data"]
> >         # users is either an empty list (bad login) or a list of one.
> >         if not users: return redirect("/")
> >         return redirect("/editor/" + users[0]["id"])
> >     if not may_edit_channel(user["_id"], channelid): return
> > redirect(url_for("mainpage"))
> >     database.create_user(channelid) # Just in case, make sure the
> > database has the basic structure
> >     channel = get_channel_setup(channelid)
> >     sched_tz, schedule, sched_tweet = database.get_schedule(channelid)
> >     if "twitter_oauth" in session:
> >         auth = session["twitter_oauth"]
> >         username = auth["screen_name"]
> >         twitter = "Twitter connected: " + username
> >         tweets = list_scheduled_tweets(auth["oauth_token"],
> > auth["oauth_token_secret"], sched_tz)
> >     else:
> >         twitter = Markup("""<div id="login-twitter"><a
> > href="/login-twitter"><img
> > src="/static/Twitter_Social_Icon_Square_Color.svg" alt="Twitter
> > logo"><div>Connect with Twitter</div></a></div>""")
> >         tweets = []
> >     error = session.get("last_error_message", "")
> >     session["last_error_message"] = ""
> >     return render_template("index.html",
> >         twitter=twitter, username=user["display_name"],
> >         channel=channel, channelid=channelid, error=error,
> >         setups=database.list_setups(channelid),
> >         sched_tz=sched_tz, schedule=schedule, sched_tweet=sched_tweet,
> >         checklist=database.get_checklist(channelid),
> >         timers=database.list_timers(channelid),
> >         tweets=tweets,
> >     )
> >
> > Now, show me which part of this should become a "namespace object".
> > That namespace would be *unique* to this function - it would have no
> > purpose or value outside of this one exact function. Show me how the
> > use of such a namespace object would improve this code. There is no
> > way that you would be able to share it with any other function in the
> > entire program.
>
> Instead of saving the variables in the local scope, you'd create
> a namespace object and write them directly into that object, e.g.
>
> ns = Namespace()
> ns.auth = session["twitter_oauth"]
> ...
> ns.tweets = []
> return render_template("index.html", ns)
>
> Another advantage of this style is that debugging becomes much
> easier, since you can see the full context used by the rendering
> function and even provide custom output methods for the namespace
> content. Your local scope doesn't get cluttered up with all the
> namespace details.
>

Meaning that every *local* use of those same names now has to be
adorned with "ns." to access the same thing:

ns.channel = get_channel_setup(ns.channelid)

Thanks, I think that's even worse than using locals(). Didn't think
that was possible. :)

ChrisA
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/VF4LAK4SMZMX2PN6HZYHCOPO7QWTPFL6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to