Assigning and Testing with One Statement
Credit: Alex Martelli
Problem
You are
transliterating C or Perl code to Python, and, to keep close to the
original’s structure, you need an
expression’s result to be both assigned and tested
(as in if((x=foo( )) or while((x=foo( )) in such other languages).
Solution
In Python, you can’t code:
if x=foo( ):
Assignment is a statement, so it cannot fit into an expression, which
is necessary for conditions of if and
while statements. Normally this
isn’t a problem, as you can just structure your code
around it. For example, this is quite Pythonic:
while 1:
line = file.readline( )
if not line: break
process(line)In modern Python, this is far better, but it’s even farther from C-like idioms:
for line in file.xreadlines( ):
process(line)In Python 2.2, you can be even simpler and more elegant:
for line in file:
process(line)But sometimes you’re transliterating C, Perl, or some other language, and you’d like your transliteration to be structurally close to the original.
One simple utility class makes this easy:
class DataHolder:
def _ _init_ _(self, value=None):
self.value = value
def set(self, value):
self.value = value
return value
def get(self):
return self.value
# optional and strongly discouraged, but handy at times:
import _ _builtin_ _
_ _builtin_ _.DataHolder = DataHolder
_ _builtin_ _.data = DataHolder( )With the help of the DataHolder class and its
data instance, you can keep your C-like code
structure intact in transliteration:
while data.set(file.readline( ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access