syntax for code blocks

Kiuhnm kiuhnm03.4t.yahoo.it
Wed May 2 06:52:50 EDT 2012


On 5/2/2012 4:43, alex23 wrote:
> [Apologies in advance if this comes through twice]
>> On May 2, 12:18 am, Kiuhnm<kiuhnm03.4t.yahoo.it> wrote:
>> "Most Pythonic" doesn't mean better, unfortunately.
>> Nor does it mean "Kiuhnm prefers it".

That goes without saying.
>> For instance, assume that you want to write a function that accepts a
>> dictionary of callbacks:
>> func(some_args, callbacks)
>>>> Pythonic way
>> ------------
>>>> def when_odd(n):
>> pass
>>>> def when_prime(n):
>> pass
>>>> def before_check():
>> pass
>>>> def after_check():
>> pass
>>>> func(some_args, {'when_odd' : when_odd,
>> 'when_prime' : when_prime,
>> 'before_check' : before_check,
>> 'after_check' : after_check})
>> When would you _ever_ define a function like this? Why are you passing
> in _named_ callbacks? Are you calling them by name? Then declare them
> in the function signature and rely on scoping. Does func() branch on
> existent keys? Then don't write code like that.
>> At the very _least_, you could change the function call to:
>> func(some_args, locals())

I think that's very bad. It wouldn't be safe either. What about name 
clashing and how would you pass only some selected functions?
A second call would also need some cleaning up leading to some serious bugs.
> But as you're _passing them in by name_ why not just make it
> func(some_args) and pick them up out of the scope.

Because that's not clean and maintainable. It's not different from using 
global variables.
> _No one_ writes Python code like this. Presenting bad code as
> "pythonic" is a bit of a straw man.

How can I present good code where there's no good way of doing that 
without my module or something equivalent?
That was my point.
>> My way
>> ------
>>>> with func(some_args)<< ':dict':
>> with when_odd as 'n':
>> pass
>> with when_prime as 'n':
>> pass
>> with before_check as '':
>> pass
>> with after_check as '':
>> pass
>> This is unintuitive, to say the least. You're effectively replacing
> the common form of function definition with "with when_odd as 'n'",
> then using the surrounding context manager to limit the scope.

What's so unintuitive about it? It's just "different".
> More importantly, _you're naming your "anonymous" code blocks_, I'm
> guessing so that func() can choose which ones to use. But if you're
> naming them, why not just use a function?

I'm creating a dictionary, not naming my blocks just for the sake of it.
If you use a function, you end up with the solution that you called 
'bad' and non-pythonic.
> I'm not entirely sure what your 'solution' offers over something like:
>> class FOO(object):
> def __init__(self, fn):
> self.fn = fn
>> def __enter__(self):
> return self.fn
>> def __exit__(self, exc_type, exc_value, traceback):
> pass
>> def func(x, before_check=None, after_check=None, when_odd=None,
> when_prime=None):
> pass
>> with FOO(func) as f:
> def before_check(x):
> pass
> def after_check(x):
> pass
> def when_odd(x):
> pass
> def when_prime(x):
> pass
>> f(1)

The problem is always the same. Those functions are defined at the 
module level so name clashing and many other problems are possible.
I remember a post on this ng when one would create a list of commands 
and then use that list as a switch table. My module let you do that very 
easily. The syntax is:
 with func() << ':list':
 with 'arg':
 cmd_code
 with 'arg':
 cmd_code
 with '':
 cmd_code
Kiuhnm


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /