On 09/11/10 23:25, Rance Hall wrote: > On Fri, Sep 10, 2010 at 6:14 PM, Lie Ryan <lie.1...@gmail.com> wrote: >> On 09/11/10 07:36, Rance Hall wrote: > > <snip> > >> In most cases in Python, you would almost never need to reference the >> list's index directly since python makes it easy to use iterators; >> however in your particular case, which is a valid exception, enumerate() >> takes an optional second argument `start` which defines the number that >> enumerate start to count with, i.e. you can do: >> >> for i, option in enumerate(mainmenuoptions, 1): >> print('%s. %s' % (i, option)) >> >>> php provided a way to change this, but I can find no documentation >>> that says python can do this as well. >> > > > Thanks everyone for responding, Because this menu structure is > repeated many times in my code, the ideal solution would have been to > "set index start = 1" in the beginning of the script.
That would produce a catastrophic effect. What would happen to standard library modules or external modules now that they have to work in a different base? > something like sysctl variables in Linux perhaps but in this case only > valid for this program. > > Its clear from the responses that this solution is not available in > python, I wish it were, it would make my life much easier for this > project. Personally I think it's a bad idea. Being able to globally rebase list index would triple the code's WTF count. > I like the approach that Lie suggested, as it seems more "natural > python" to me as opposed to a workaround. > > However this is also only half a solution since it applies to the > printed menus only and not to the response afterward. > > It seems that Luke is right looks like we have to do math with the indexes. > > Lie also referred to my particular case as a valid exception, are > there enough other such valid exceptions that requesting a feature > enhancement would gain some traction? When I mean, a valid exception, it's referring to "knowing the index number" of a list, not to the ability of changing the list's base. > If this is but one of a few special cases, I doubt it would be worth > the time or trouble to formally make the request. As an alternative solution, you can derive from UserList and overload the __getitem__ and __setitem__ operator: from UserList import UserList class RebasedList(UserList): def __init__(self, base=1, *args, **kwargs): UserList.__init__(self, *args, **kwargs) self.base = base def __getitem__(self, index): if self.base <= index < self.base + len(self): return UserList.__getitem__(self, index - self.base) else: raise IndexError( "RebasedList index out of range [%s-%s), " "given index %s" % (self.base, self.base+len(self), index)) def __setitem__(self, index, item): if self.base <= index < self.base + len(self): return UserList.__setitem__(self, index - self.base, item) else: raise IndexError( "RebasedList assignment index out of range [%s-%s), " "given index %s" % (self.base, self.base+len(self), index)) # for complete emulation, you will also need to override: # __iter__, __delitem__, __getslice__, __setslice__, # __delslice__, __add__, __mul__, index, insert, pop, # remove, and possibly others You can use it like this: rl = RebasedList(10, [3, 1, 2, 4, 2, 1] rl[10] # rl[0] rl[11] = 29 # rl[1] = 29 print rl # [3, 29, 2, 4, 2, 1] Then there is the case that negative index no longer work cleanly with a custom list base. > Maybe I should ask if there is a better way to do what I want to do > here. Is there? _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor