Symbols as parameters?
Dave Angel
davea at ieee.org
Fri Jan 22 06:56:01 EST 2010
Roald de Vries wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">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 solve
>> 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 *" you
>> 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 call
>>
>> So it should look something like this
>>
>> ... magic, magic ...
>> move(up)
>> ... unmagic, unmagic ...
>> print up
>>
>> This should complain that "up" is not defined during the "print" call,
>> but not when move() is called. And of course there should be as little
>> magic as possible.
>>
>> Any way to achieve this?
>
> You could do something like this:
>
> class Move(object):
> def __call__(self, direction):
> print(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.
>
Once pointed down that road, how about:
class Move(object):
def __call__(self, direction):
print(direction)
return 0
@property
def up(self):
return self('up')
move = Move()
Now you can just say
move.up
with no parentheses.
When I've wanted a DSL (Domain Specific Language) in the past, I've used
Forth. It has so little syntax of its own, it's not hard to design your
own simple syntax for a particular problem. And one of the things you
can do is to define keywords that intercept the compile process of the
following token (or line, or whatever).
I am not claiming it's quick to become that proficient in Forth,
however. The learning curve has a couple of steep sections, and this
sort of thing is one of them.
DaveA
More information about the Python-list
mailing list