Creating a local variable scope.
Alf P. Steinbach
alfps at start.no
Mon Nov 30 06:34:59 EST 2009
* Jean-Michel Pichavant:
> Steven D'Aprano wrote:
>> On Mon, 30 Nov 2009 02:11:12 +0100, Alf P. Steinbach wrote:
>>
>>
>>> I think if one could somehow declare names as const (final, readonly,
>>> whatever) then that would cover the above plus much more.
>>>
>>
>> Having real constants is one feature that I miss. Because Python
>> doesn't have constants, I find I've lost the discipline to avoid
>> "magic numbers" (and strings) in my code.
>>
>>
>>
> I don't get you, this can be easily avoid with a strong naming
> convention. I mean, despite they are not really constants, you can still
> use variables to name your numbers and string, to give the reader a
> usefull hint on the meaning of your code. Yet it is still a matter of
> discipline, it is sometimes very tempting to put the string directly
> (unlike numbers string can be meaningful sometimes)
It may be surprising how many things turn out to be readonly.
Consider the OP's code:
<code>
class ValueColumn(AbstractColumn):
def __init__(self, name, header, domain_names):
if type(domain_names) != tuple:
raise ValueError('a tuple of domain names must be given')
for name in domain_names:
if type(name) != str:
raise ValueError('a tuple of domain names must be given')
self.domain_names = domain_names
super(ValueColumn, self).__init__(name, header)
</code>
Here the arguments should ideally be read only names, which would have cought
the bug of reusing 'name' in the for loop.
But you really wouldn't code this as
<code>
class ValueColumn(AbstractColumn):
def __init__(SELF, NAME, HEADER, DOMAIN_NAMES):
if type(DOMAIN_NAMES) != tuple:
raise ValueError('a tuple of domain names must be given')
for name in DOMAIN_NAMES:
# Argh, at this point 'name' is readonly, but cannot express that.
if type(name) != str:
raise ValueError('a tuple of domain names must be given')
SELF.domain_names = domain_names
super(ValueColumn, SELF).__init__(NAME, HEADER)
</code>
Or, at least I wouldn't do that.
It's ugly.
And you have to /change the names/ as the readonly-ness changes.
Cheers,
- Alf
More information about the Python-list
mailing list