It is my first message on this list, therefore I would like to say
hello to everyone. I am fourth year student of CS on the Univeristy of
Warsaw and recently I have become very interested in dynamically typed
languages, especially Python.
I would like to ask, whether there is any way of explicitly declaring
variables used in a function? While I am pretty sure, that there is no
such way in the language itself, I would like to know, whether there
are any third-party tools to do that. This would be very useful for me
during development, so I am looking for such a tool.
--
Filip Gruszczyński
def a_function(args):
# Local variables: item, item2
...
;-)
You mean the type? Not in 2.x, but in 3.x, there are function
annotations:
def a_function(arg1: int, arg2: str) -> None: pass
>
> --
> Filip Gruszczyński
> I have become very interested in dynamically typed languages,
> especially Python.
Good to know. Welcome to the group.
> I would like to ask, whether there is any way of explicitly
> declaring variables used in a function?
Declaring what about them? If you mean declaring the type, remember
that Python deliberately allows any name to be bound to any object;
type declarations can't be enforced without losing a lot of the power
of Python.
--
\ "Hanging one scoundrel, it appears, does not deter the next. |
`\ Well, what of it? The first one is at least disposed of." -- |
_o__) Henry L. Mencken |
Ben Finney
> Hello everyone!
>
> It is my first message on this list, therefore I would like to say
> hello to everyone. I am fourth year student of CS on the Univeristy of
> Warsaw and recently I have become very interested in dynamically typed
> languages, especially Python.
Welcome to Python!
> I would like to ask, whether there is any way of explicitly declaring
> variables used in a function? While I am pretty sure, that there is no
> such way in the language itself, I would like to know, whether there
> are any third-party tools to do that. This would be very useful for me
> during development, so I am looking for such a tool.
Not part of the language itself, but there are some tools to do static
code analysis, like PyLint and PyChecker; see
http://wiki.python.org/moin/static_source_analysis
--
Gabriel Genellina
Nope, I don't like types ;-) 3.x seems pretty revolutionary, and this
typing can be appreciated by some people.
> Declaring what about them? If you mean declaring the type, remember
> that Python deliberately allows any name to be bound to any object;
> type declarations can't be enforced without losing a lot of the power
> of Python.
Just declaring, that they exist. Saying, that in certain function
there would appear only specified variables. Like in smalltalk, if I
remember correctly.
--
Filip Gruszczyński
A lot of people assume that's what the __slots__ feature of the new
object model is for, but it isn't: it's actually a memory conservation
device for circumstances when millions of objects must be created in an
application.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
> Filip GruszczyŹ"ski wrote:
>> Just declaring, that they exist. Saying, that in certain function
>> there would appear only specified variables. Like in smalltalk, if I
>> remember correctly.
>>
> Icon has (had?) the same feature: if the "local" statement appeared
then
> the names listed in it could be assigned in the local namespace, and
> assignment to other names wasn't allowed.
Python being what it is, it is easy enough to add support for declaring
at the top of a function which local variables it uses. I expect that
actually using such functionality will waste more time than it saves,
but here's a simple enough implementation:
def uses(names):
def decorator(f):
used = set(f.func_code.co_varnames)
declared = set(names.split())
undeclared = used-declared
unused = declared-used
if undeclared:
raise ValueError("%s: %s assigned but not declared"
% (f.func_name, ','.join(undeclared)))
if unused:
raise ValueError("%s: %s declared but never used"
% (f.func_name, ','.join(unused)))
return f
return decorator
Used something like this:
>>> @uses("x y")
def f(x):
y = x+1
return z
>>> @uses("x y z")
def f(x):
y = x+1
return z
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
@uses("x y z")
File "<pyshell#32>", line 10, in decorator
raise ValueError("%s: %s declared but never used" % (f.func_name,
','.join(unused)))
ValueError: f: z declared but never used
>>> @uses("x")
def f(x):
y = x+1
return z
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
@uses("x")
File "<pyshell#32>", line 8, in decorator
raise ValueError("%s: %s assigned but not declared" % (f.func_name,
','.join(undeclared)))
ValueError: f: y assigned but not declared
>>>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
--
Filip Gruszczyński
If you want to just declare that name exist, but doesn't want to
declare the type, why don't you just do this:
def somefunc():
nonlocal = nonlocal
local = 0 # or None or [] or an initial value
#
return nonlocal * local
Err.. I don't quite get. How it may help me? Could you explain?
--
Filip Gruszczyński
Names do not 'exist' in Python, nor do they have types. They are bound to
objects that have types. Learn to program Python as Python, not one of
those languages with a quite different model of names and values.
| > def somefunc():
| > nonlocal = nonlocal
Syntax error in 3.0. Error or nonsense in 2.x
| > local = 0 # or None or [] or an initial value
| > #
| > return nonlocal * local
|
| Err.. I don't quite get. How it may help me? Could you explain?
Forget the above. The only 'declarations' in Python, 'global' and
'nonlocal' are for the specialized purpose of *binding* names that are not
in the local namespace of a function or nested function. They are only
needed because otherwise names that get bound are otherwise assumed to be
local. See the language ref section on function defs.
tjr
Hi Filip,
In Python the standard patten for "declaring" variables is just to assign to
them as they are needed. If you want the effect of a declaration as you
would do in C, you can just define the variable and initialize it to 0 or
None. (Or {} for a new dictionary, or [] for a new list.)
eg,
def collaterecs():
recordscount = 0
recordlist = []
...
return recordlist
Yep, I get it and I absolutely love this about Python. What I don't
actually love is situation, where I misspell and instead of setting
one variable, other is created. This is why I would like to declare
variables first and say, that these are the only ones, that can be set
in certain function (the same with fields in a class).
I am finishing a small tool, that allows to create such declarations
in similar manner to Smalltalk declarations. I hope I can post a link
to it soon.
--
Filip Gruszczyński