PEP suggestion: Uniform way to indicate Python language version
rocky
rocky at gnu.org
Mon Aug 22 06:32:26 EDT 2016
On Monday, August 22, 2016 at 1:36:07 AM UTC-4, Steven D'Aprano wrote:
> On Monday 22 August 2016 14:33, Chris Angelico wrote:
>
> > On Mon, Aug 22, 2016 at 1:37 PM, rocky <rocky at gnu.org> wrote:
> >> Sorry should have been:
> >>
> >> assert sys.version_info >= (3,0)
> >
> > The next question is: How common is code like this? I don't put
> > version checks in any of my modules. Adding magic comments would be of
> > value only if this sort of thing is common enough to need its own
> > syntax.
>
> Most of my code is supposed to work on Python 2.4 through the latest 3.x
> version. That means I have lots of version-specific code.
>
> But most of it uses feature detection rather than version checks. So instead of
> writing:
>
> if sys.version < '3':
> def next(iterator):
> return iterator.next()
>
>
> I write this:
>
> try:
> next
> except NameError:
> def next(iterator):
> return iterator.next()
>
> or possibly this:
>
>
> if not hasattr(builtins, 'next'):
> def next(iterator):
> return iterator.next()
>
>
> But some features depend on new syntax, and you can't check for the
> availability of new syntax at runtime. (Well, you can, by clever use of exec(),
> but its too much trouble than its worth.) So very, very occasionally I have to
> do a version check:
>
>
> if sys.version < '3':
> import mymodule2 as mymodule
> else:
> import mymodule3 as mymodule
>
>
> But... I don't understand what this proposal actually is. We already have a
> uniform way to indicate the Python language version: check sys.version, or
> sys.version_info, or sys.hexversion, whichever is more appropriate for your
> needs.
The fact that you mention 3 different ways says to me this isn't uniform.
> Because this is just an ordinary comparison, you can then do whatever
> you like, no matter how outlandish or unusual:
>
>
> if sys.version < '3':
> try:
> import mymodule3
> except SyntaxError:
> print("Yay, a syntax error!")
> else:
> print("Now that's weird, that shouldn't happen...")
> del mymodule3
> import mymodule2 as mymodule
> elif config[RUN_OLD_VERSION]:
> import mymodule2 as mymodule
> else:
> import mymodule3 as mymodule
>
>
> Could somebody (the OP?) please explain what is the purpose of this proposal,
> what it does, how it works, and when would people use it?
All of the ways you mention involve running the program. Suppose you have a tool that analyzes source code. It reads the code, but doesn't run it. For example possibly code climate. How it it figure out which dialect of Python is being used?
>
>
>
> --
> Steve
More information about the Python-list
mailing list