Symbols as parameters?
Roald de Vries
rdv at roalddevries.nl
Thu Jan 28 17:01:38 CET 2010
On Jan 22, 2010, at 11:56 AM, Roald de Vries wrote:
> Hi Martin,
> On Jan 21, 2010, at 8:43 AM, Martin Drautzburg wrote:
>> Hello all,
>> When passing parameters to a function, you sometimes need a paramter
>> which can only assume certain values, e.g.
>> def move (direction):
>> If direction can only be "up", "down", "left" or "right", you can
>> this by passing strings, but this is not quite to the point:
>> - you could pass invalid strings easily
>> - you need to quote thigs, which is a nuisance
>> - the parameter IS REALLY NOT A STRING, but a direction
>> Alternatively you could export such symbols, so when you "import *"
>> have them available in the caller's namespace. But that forces you
>> to "import *" which pollutes your namespace.
>> What I am really looking for is a way
>> - to be able to call move(up)
>> - having the "up" symbol only in the context of the function
>> So it should look something like this
>> ... magic, magic ...
>> ... unmagic, unmagic ...
>> print up
>> This should complain that "up" is not defined during the "print"
>> but not when move() is called. And of course there should be as
>> magic as possible.
>> Any way to achieve this?
> You could do something like this:
> class Move(object):
> def __call__(self, direction):
> return 0
> def up(self):
> return self('up')
> move = Move()
> Now move.up() means move('up'), and you can obviously do similar
> things for other directions.
Question out of general interest in the language:
If I would want to generate such functions in a for-loop, what would I
have to do? This doesn't work:
def __call__(self, direction):
move = Move()
for f in ['up', 'down', 'right', 'left']:
move.__dict__[f] = lambda: move(f)
... because now 'move.up()' returns 'left' because thats the current
value of f. Is there a way to 'expand' f in the loop? Or a reason that
you never should use this?
More information about the Python-list