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

Re: [Xen-devel] python3 issues



On Tue, Mar 26, 2019 at 10:06:48PM +0100, Hans van Kranenburg wrote:
> On 3/26/19 7:18 PM, M A Young wrote:
> > On Tue, 26 Mar 2019, Wei Liu wrote:
> > 
> >> On Tue, Mar 26, 2019 at 01:16:35PM +0000, Wei Liu wrote:
> >>> On Mon, Mar 25, 2019 at 10:20:05PM +0000, YOUNG, MICHAEL A. wrote:
> >>>>          if ty.init_fn is not None:
> >>>> --- xen-4.12.0-rc6/tools/pygrub/src/GrubConf.py.orig     2019-03-24 
> >>>> 22:44:05.502581989 +0000
> >>>> +++ xen-4.12.0-rc6/tools/pygrub/src/GrubConf.py  2019-03-24 
> >>>> 22:49:14.025934786 +0000
> >>>> @@ -230,10 +230,10 @@
> >>>>      def _get_default(self):
> >>>>          return self._default
> >>>>      def _set_default(self, val):
> >>>> -        if val == "saved":
> >>>> +        if val == "saved" or not val.isdecimal():
> >>
> >> Your change suggested there could be a non-decimal string that is not
> >> "saved" -- is this really needed?
> > 
> > It is getting set to ${next_entry} presumably from the clause 
> > 
> > if [ "${next_entry}" ] ; then
> >    set default="${next_entry}"
> >    set next_entry=
> >    save_env next_entry
> >    set boot_once=true
> > else
> >    set default="${saved_entry}"
> > fi
> > 
> > in the grub.cfg file giving the error
> > 
> >   File "/usr/lib64/python3.7/site-packages/grub/GrubConf.py", line 239, in 
> > _set_default
> >     if self._default < 0:
> > TypeError: '<' not supported between instances of 'str' and 'int'
> > 
> > I didn't see this with python 2 before the patch so I assume python3 is 
> > more fussy.
> 
> Comparison is also used for sorting.
> 
> In Python 2, numeric values always sort before strings. So, for example:
> 
> == sorted(['a','b','c', 1, 2, 3])
> [1, 2, 3, 'a', 'b', 'c']
> 
> However, this behavior also easily leads to bugs, for example when
> someone forgets to convert strings that hold numeric values to actual
> numbers and still compares things, which silently introduces unintended
> behavior.
> 
> So, the above if self._default < 0 will just always be False if
> self._default is a string. I didn't read the context of these lines, but
> this looks like an actual bug currently.
> 
> Python 3 no longer allows comparing string and int, because it doesn't
> make sense.
> 
> == sorted([1,2,3,'a','b','c'])
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: unorderable types: str() < int()

Thanks for the detailed explanation!

I think the original behaviour is not very nice. Python lacking type
annotation doesn't help either.

> 
> So I guess that if the contents are expected to be "saved" or a number
> as string like "1", "2", then:
> 
> 1. check for "saved"
> 2. try: int(val) except: blah
> 3. etc

I think a better way is to use string conversation all the way -- it
doesn't make sense for an API to return string sometimes and integers
sometimes. I will give it a stab.

Wei.

_______________________________________________
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®.