[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

for loop without variable

erik gartz

1/9/2008 10:26:00 PM

Hi. I'd like to be able to write a loop such as:
for i in range(10):
pass
but without the i variable. The reason for this is I'm using pylint
and it complains about the unused variable i. I can achieve the above
with more lines of code like:
i = 0
while (i != 10):
i += 1
Is there a concise way to accomplish this without adding extra lines
of codes? Thanks in advance for your help.
38 Answers

Fredrik Lundh

1/9/2008 10:41:00 PM

0

erik gartz wrote:

> Hi. I'd like to be able to write a loop such as:
> for i in range(10):
> pass
> but without the i variable. The reason for this is I'm using pylint
> and it complains about the unused variable i.

if a computer tells you to do something stupid, it's often better to
find a way to tell the computer to shut up than to actually do some-
thing stupid.

(pylint's online documentation is remarkably unreadable, so I cannot
help you with the details, but surely there's a way to disable that
test, either globally, or for a specific region of code?).

</F>

Diez B. Roggisch

1/9/2008 10:59:00 PM

0

erik gartz schrieb:
> Hi. I'd like to be able to write a loop such as:
> for i in range(10):
> pass
> but without the i variable. The reason for this is I'm using pylint
> and it complains about the unused variable i. I can achieve the above
> with more lines of code like:
> i = 0
> while (i != 10):
> i += 1
> Is there a concise way to accomplish this without adding extra lines
> of codes? Thanks in advance for your help.

The underscore is used as "discarded" identifier. So maybe


for _ in xrange(10):
...


works.

Diez

Tim Chase

1/9/2008 11:01:00 PM

0

>> Hi. I'd like to be able to write a loop such as:
>> for i in range(10):
>> pass
>> but without the i variable. The reason for this is I'm using pylint
>> and it complains about the unused variable i.
>
> if a computer tells you to do something stupid, it's often better to
> find a way to tell the computer to shut up than to actually do some-
> thing stupid.
>
> (pylint's online documentation is remarkably unreadable, so I cannot
> help you with the details, but surely there's a way to disable that
> test, either globally, or for a specific region of code?).

That documentation on PyLint[1] is atrocious!

From my reading of it, at the beginning of your file, you put a
comment something like

# pylint: disable-msg=W0612

which should disable that particular message. Totally untested.

I don't know if PyLint is smart enough, but if you don't use "i",
you might use the common "throwaway" variable of "_":

for _ in xrange(10):
do_something()

in which case it _might_ recognize that it's a throwaway variable
and not warn you about it. At least that would be nice of it.
But given the abusive nature of the documenation, I'm not sure
that's the case ;)

-tkc
[1]http://www.logilab.org/card/pyli...


Thomas Heller

1/9/2008 11:06:00 PM

0

erik gartz schrieb:
> Hi. I'd like to be able to write a loop such as:
> for i in range(10):
> pass
> but without the i variable. The reason for this is I'm using pylint
> and it complains about the unused variable i.

Pychecker won't complain if you rename 'i' to '_', IIRC:

for _ in range(10):
pass

Thomas

Ben Finney

1/9/2008 11:18:00 PM

0

"Diez B. Roggisch" <deets@nospam.web.de> writes:

> The underscore is used as "discarded" identifier. So maybe
>
> for _ in xrange(10):
> ...

The problem with the '_' name is that it is already well-known and
long-used existing convention for an entirely unrelated purpose: in
the 'gettext' i18n library, the '_' function to get the
locally-translated version of a text string.

Since the number of programs that need to use something like 'gettext'
(and therefore use the '_' function) is likely only to increase, it
seems foolish to set one's program up for a conflict with that
established usage.

I've seen 'dummy' used as a "don't care about this value" name in
other Python code. That seems more readable, more explicit, and less
likely to conflict with existing conventions.

--
\ "It is forbidden to steal hotel towels. Please if you are not |
`\ person to do such is please not to read notice." -- Hotel |
_o__) sign, Kowloon, Hong Kong |
Ben Finney

John Machin

1/9/2008 11:57:00 PM

0

On Jan 10, 10:00 am, Tim Chase <python.l...@tim.thechases.com> wrote:
> >> Hi. I'd like to be able to write a loop such as:
> >> for i in range(10):
> >> pass
> >> but without the i variable. The reason for this is I'm using pylint
> >> and it complains about the unused variable i.
>
> > if a computer tells you to do something stupid, it's often better to
> > find a way to tell the computer to shut up than to actually do some-
> > thing stupid.
>
> > (pylint's online documentation is remarkably unreadable, so I cannot
> > help you with the details, but surely there's a way to disable that
> > test, either globally, or for a specific region of code?).
>
> That documentation on PyLint[1] is atrocious!
>
> From my reading of it, at the beginning of your file, you put a
> comment something like
>
> # pylint: disable-msg=W0612
>
> which should disable that particular message. Totally untested.
>
> I don't know if PyLint is smart enough, but if you don't use "i",
> you might use the common "throwaway" variable of "_":
>
> for _ in xrange(10):
> do_something()
>
> in which case it _might_ recognize that it's a throwaway variable
> and not warn you about it. At least that would be nice of it.
> But given the abusive nature of the documenation, I'm not sure
> that's the case ;)
>
> -tkc
> [1]http://www.logilab.org/card/pyli...

I didn't get as far as the allegedly "abusive" part. I followed the
link that you gave, but no matter what I clicked on, it would go
looking for an obviously incorrect URL like http://www.logilab.org/#messages-contr...
and just go (slowly!) to the home page ...

MRAB

1/10/2008 1:34:00 AM

0

On Jan 9, 11:17 pm, Ben Finney <bignose+hates-s...@benfinney.id.au>
wrote:
> "Diez B. Roggisch" <de...@nospam.web.de> writes:
>
> > The underscore is used as "discarded" identifier. So maybe
>
> > for _ in xrange(10):
> > ...
>
> The problem with the '_' name is that it is already well-known and
> long-used existing convention for an entirely unrelated purpose: in
> the 'gettext' i18n library, the '_' function to get the
> locally-translated version of a text string.
>
> Since the number of programs that need to use something like 'gettext'
> (and therefore use the '_' function) is likely only to increase, it
> seems foolish to set one's program up for a conflict with that
> established usage.
>
> I've seen 'dummy' used as a "don't care about this value" name in
> other Python code. That seems more readable, more explicit, and less
> likely to conflict with existing conventions.
>
Perhaps a "discarded" identifier should be any which is an underscore
followed by digits.

A single leading underscore is already used for "private" identifiers,
but they are usually an underscore followed by what would be a valid
identifier by itself, eg. "_exit".

The convention would then be:

2 underscores + valid_by_self + 2 underscores => special

underscore + valid_by_self => private

underscore + invalid_by_self => dummy

jt

1/10/2008 1:36:00 AM

0

On Wed, 09 Jan 2008 14:25:36 -0800, erik gartz wrote:

> Hi. I'd like to be able to write a loop such as:
> for i in range(10):
> pass
> but without the i variable. The reason for this is I'm using pylint and
> it complains about the unused variable i ...

What does that loop do? (Not the loop you posted, but the "real" loop
in your application.) Perhaps python has another way to express what
you're doing.

For example, if you're iterating over the elements of an array, or
through the lines of a file, or the keys of a dictionary, the "in"
operator may work better:

for thing in array_or_file_or_dictionary:
do_something_with(thing)

HTH,
Dan

--
Dan Sommers A death spiral goes clock-
<http://www.tombstonezero.ne... wise north of the equator.
Atoms are not things. -- Werner Heisenberg -- Dilbert's PHB

erik gartz

1/10/2008 2:50:00 AM

0

On Jan 9, 8:35 pm, Dan Sommers <m...@privacy.net> wrote:
> On Wed, 09 Jan 2008 14:25:36 -0800, erik gartz wrote:
> > Hi. I'd like to be able to write a loop such as:
> > for i in range(10):
> > pass
> > but without the i variable. The reason for this is I'm using pylint and
> > it complains about the unused variable i ...
>
> What does that loop do? (Not the loop you posted, but the "real" loop
> in your application.) Perhaps python has another way to express what
> you're doing.
>
> For example, if you're iterating over the elements of an array, or
> through the lines of a file, or the keys of a dictionary, the "in"
> operator may work better:
>
> for thing in array_or_file_or_dictionary:
> do_something_with(thing)
>
> HTH,
> Dan
>
> --
> Dan Sommers A death spiral goes clock-
> <http://www.tombstonezero.ne... wise north of the equator.
> Atoms are not things. -- Werner Heisenberg -- Dilbert's PHB

The loop performs some actions with web services. The particular
iteration I'm on isn't important to me. It is only important that I
attempt the web services that number of times. If I succeed I
obviously break out of the loop and the containing function (the
function which has the loop in it) returns True. If all attempts fail
the containing loop returns False.

I guess based on the replies of everyone my best bet is to leave the
code the way it is and suck up the warning from pylint. I don't want
to turn the warning off because catching unused variables in the
general is useful to me. Unfortunately, I don't *think* I can shut the
warning for that line or function off, only for the entire file.
Pylint gives you a rating of your quality of code which I think is
really cool. This is a great motivation and helps me to push to
"tighten the screws". However it is easy to get carried away with your
rating.:-)

Basilisk96

1/10/2008 3:17:00 AM

0

On Jan 9, 9:49 pm, erik gartz <eegun...@yahoo.com> wrote:
> The loop performs some actions with web services. The particular
> iteration I'm on isn't important to me. It is only important that I
> attempt the web services that number of times. If I succeed I
> obviously break out of the loop and the containing function (the
> function which has the loop in it) returns True. If all attempts fail
> the containing loop returns False.

Do you think you could apply something like this:

def foo():print "fetching foo..."
actions = (foo,)*5
for f in actions:
f()

fetching foo...
fetching foo...
fetching foo...
fetching foo...
fetching foo...

...but not knowing your specific implementation, I may be off the wall
here.

Cheers,
-Basilisk96