[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-next v2 v2 2/5] libxl: make python scripts work with python 2.6 and up



On Wed, Mar 06, 2019 at 09:58:19PM +0100, Hans van Kranenburg wrote:
> On 3/6/19 6:52 PM, Wei Liu wrote:
> > Go through the transformations suggested by 2to3 and pick the
> > necessary ones.
> > 
> > Use sys.stderr.write to avoid importing from __future__.
> > 
> > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> > ---
> >  tools/libxl/gentest.py  |  2 +-
> >  tools/libxl/gentypes.py | 10 +++++-----
> >  tools/libxl/idl.py      | 13 ++++++-------
> >  3 files changed, 12 insertions(+), 13 deletions(-)
> > 
> > diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py
> > index 989959fc68..81e13b437c 100644
> > --- a/tools/libxl/gentest.py
> > +++ b/tools/libxl/gentest.py
> > @@ -86,7 +86,7 @@ def gen_rand_init(ty, v, indent = "    ", parent = None):
> >  
> >  if __name__ == '__main__':
> >      if len(sys.argv) < 3:
> > -        print >>sys.stderr, "Usage: gentest.py <idl> <implementation>"
> > +        sys.stderr.write("Usage: gentest.py <idl> <implementation>\n")
> >          sys.exit(1)
> >  
> >      random.seed(os.getenv('LIBXL_TESTIDL_SEED'))
> > diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py
> > index 88e5c5f30e..656c157c01 100644
> > --- a/tools/libxl/gentypes.py
> > +++ b/tools/libxl/gentypes.py
> > @@ -576,14 +576,14 @@ def libxl_C_enum_from_string(ty, str, e, indent = "   
> >  "):
> >  
> >  if __name__ == '__main__':
> >      if len(sys.argv) != 6:
> > -        print >>sys.stderr, "Usage: gentypes.py <idl> <header> 
> > <header-private> <header-json> <implementation>"
> > +        sys.stderr.write("Usage: gentypes.py <idl> <header> 
> > <header-private> <header-json> <implementation>\n")
> >          sys.exit(1)
> >  
> >      (_, idlname, header, header_private, header_json, impl) = sys.argv
> >  
> >      (builtins,types) = idl.parse(idlname)
> >  
> > -    print "outputting libxl type definitions to %s" % header
> > +    print("outputting libxl type definitions to %s" % header)
> 
> Note that print is *not* a function in python 2, unless you..
> 
>   from __future__ import print_function
> 
> ...which should not be avoided.
> 

I know. print in 2 is a statement but in 3 is a function.

Yet this transformation is done by 2to3 _without_ importing
print_function. I thought it was a blessed way of doing stuff. I went
through those transformations. They looked correct (although I agree
they were confusing).

Importing print_function was specifically avoided because we wanted 2.4
compatibility at first. But now I propose to bump the requirement to
2.6, the from __future__ import print_function may become available. I
will need to check if that works with 2.6.

> It looks like print() just works as a function, but it's not, and I
> would recommend against introducing this kind of misleading code.
> 
> In print("hallo"), the parentheses are part of an expression, like in
>   ((1+ 1) * 2)
> 
> Other syntax with parentheses creates tuples.
> 
> Python 2.7.13 (>>> replaced with ===)
> 
> === type(())
> <type 'tuple'>
> === type((1+1))
> <type 'int'>
> === type((1, 2))
> <type 'tuple'>
> 
> === print () <- tuple
> ()
> === print (1+1) <- expression
> 2
> === print (1, 2) <- tuple
> (1, 2)
> 
> === from __future__ import print_function
> === print()
> 
> === print(1+1)
> 2
> === print(1, 2)
> 1 2
> 
> >      f = open(header, "w")
> >  
> > @@ -633,7 +633,7 @@ if __name__ == '__main__':
> >      f.write("""#endif /* %s */\n""" % (header_define))
> >      f.close()
> >  
> > -    print "outputting libxl JSON definitions to %s" % header_json
> > +    print("outputting libxl JSON definitions to %s" % header_json)
> >  
> >      f = open(header_json, "w")
> >  
> > @@ -657,7 +657,7 @@ if __name__ == '__main__':
> >      f.write("""#endif /* %s */\n""" % header_json_define)
> >      f.close()
> >  
> > -    print "outputting libxl type internal definitions to %s" % 
> > header_private
> > +    print("outputting libxl type internal definitions to %s" % 
> > header_private)
> >  
> >      f = open(header_private, "w")
> >  
> > @@ -683,7 +683,7 @@ if __name__ == '__main__':
> >      f.write("""#endif /* %s */\n""" % header_json_define)
> >      f.close()
> >  
> > -    print "outputting libxl type implementations to %s" % impl
> > +    print("outputting libxl type implementations to %s" % impl)
> >  
> >      f = open(impl, "w")
> >      f.write("""
> > diff --git a/tools/libxl/idl.py b/tools/libxl/idl.py
> > index 2a7f3c44fe..b5bfc66b50 100644
> > --- a/tools/libxl/idl.py
> > +++ b/tools/libxl/idl.py
> > @@ -11,7 +11,7 @@ DIR_BOTH = 3
> >  _default_namespace = ""
> >  def namespace(s):
> >      if type(s) != str:
> > -        raise TypeError, "Require a string for the default namespace."
> > +        raise TypeError("Require a string for the default namespace.")
> >      global _default_namespace
> >      _default_namespace = s
> >  
> > @@ -346,7 +346,7 @@ class OrderedDict(dict):
> >          return [(x,self[x]) for x in self.__ordered]
> >  
> >  def parse(f):
> > -    print >>sys.stderr, "Parsing %s" % f
> > +    sys.stderr.write("Parsing %s\n" % f)
> 
> And if you have it from future anyway...
> 
> print("Parsing", f, file=sys.stderr)
> 

Yeah, the first version had this. But then I deleted the import and rewrote
the patch.

Wei.

> >      globs = {}
> >      locs = OrderedDict()
> > @@ -362,11 +362,10 @@ def parse(f):
> >              globs[n] = t
> >  
> >      try:
> > -        execfile(f, globs, locs)
> > -    except SyntaxError,e:
> > -        raise SyntaxError, \
> > -              "Errors were found at line %d while processing %s:\n\t%s"\
> > -              %(e.lineno,f,e.text)
> > +        exec(compile(open(f).read(), f, 'exec'), globs, locs)
> > +    except SyntaxError as e:
> > +        raise SyntaxError("Errors were found at line %d while processing 
> > %s:\n\t%s"\
> > +              %(e.lineno,f,e.text))
> >  
> >      types = [t for t in locs.ordered_values() if isinstance(t,Type)]
> >  
> > 
> 
> Hans

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.