[Python-3000] sets in P3K?
Nick Coghlan
ncoghlan at gmail.com
Wed Apr 26 12:51:57 CEST 2006
Edward Loper wrote:
> One way around this conflict might be to define a new factory function,
> that generates a set from an iterable. I.e., something like:
>
> s = set.from_iter(my_list)
> s = set.from_iter(enumerate(my_list))
> s = set.from_iter(x for x in collection if x>10)
>
> (But with a better name than 'from_iter' :) )
Some might object to this as being too magical, but one option is a metaclass
that overrides __getitem__ as an alternative constructor to the usual
__call__. Numpy uses this trick to good effect for building matrices.
A single metaclass could cover most builtin and standard library containers:
def __getitem__(self, args):
# This just defines the semantics. A real implementation would
# avoid the temporary objects wherever possible.
if not isinstance(args, tuple):
args = (args,)
arglist = []
for item in args:
if isinstance(item, slice):
if item.step is None:
item = (item.start, item.stop)
else:
item = (item.start, item.stop, item.step)
arglist.append(item)
return self(*arglist)
Then you could have:
s = set[1, 2, 3] # == set((1, 2, 3))
f = frozenset[1, 2, 3] # == frozenset((1, 2, 3))
d = dict[1:'x', 2:'y'] # == {1:'x', 2:'y'} == dict(((1,'x'), (2,'y')))
l = list[1, 2, 3] # == [1, 2, 3] == list((1, 2, 3))
t = tuple[1, 2, 3] # == (1, 2, 3) == tuple((1, 2, 3))
This can also be spelt more explicitly, but doing so pretty much misses the
point of this discussion (we're only talking about avoiding a couple of
parentheses, after all).
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://www.boredomandlaziness.org
More information about the Python-3000
mailing list