[Python-ideas] Inline Functions - idea

Ned Batchelder ned at nedbatchelder.com
Wed Feb 5 16:22:01 CET 2014


On 2/5/14 9:32 AM, Alex Rodrigues wrote:
> Hi everyone,
>
> This is my first time on the Python mailing lists. I've been learning 
> a lot about how python is run recently and today I thought I ran 
> across an idea which might create in interesting discussion.
> Today I was writing a piece of software where I had a block of code 
> that would take a bunch of local variables, apply some transformations 
> to them and then output them as a a string to a log. Then I realized 
> that I actually wanted to reuse this code in multiple locations - 
> there were multiple cases where I might need to do this. My natural 
> inclination was to write a function in order to maintain DRY 
> programming. This was prohibitively challenging, however, since the 
> code itself interacted with lots of variables in the namespace. The 
> number of arguments to the function would have to be very large and 
> possibly would change on a fairly regular basis.
> This seems like a fairly common problem in programming, having a piece 
> of code which is both reused and heavily integrated with the namespace 
> making it necessary to use copy-paste. As a solution to this I propose 
> the idea of an inline function. An inline function would run in it's 
> parent's namespace instead of creating a new one. This would allow you 
> to avoid passing back and forth tons of values while still maintaining 
> DRY code. It might look something like this if implemented in a log 
> for a traction control system:
>
> # First without an inline function
> def main():
>     file = open('file.txt')
>     counter = 0
>     while True:
> counter += 1
> frontL, frontR, backL, backR = getWheelSpeeds()
>  if counter > 100: # Log at least every 10 seconds
> slipL = abs(frontL - backL)
> slipR = abs(frontR - backR)
> file.write('Speeds: ('+frontL+', '+frontR+', '+backL+', '+backR+'), \n 
> Slip: '+slipL+', '+slipR)
> counter = 0
>  elif abs(frontR-backR) > 1 or abs(frontL-backL) > 1: # Also log if 
> the wheels are slipping
> slipL = abs(frontL - backL)
> slipR = abs(frontR - backR)
> file.write('Speeds: ('+frontL+', '+frontR+', '+backL+', '+backR+'), \n 
> Slip: '+slipL+', '+slipR)
> counter = 0
>  elif average([frontL, frontR, backL, backR]) > 60: # Also log if 
> we're going really fast
> slipL = abs(frontL - backL)
> slipR = abs(frontR - backR)
> file.write('Speeds: ('+frontL+', '+frontR+', '+backL+', '+backR+'), \n 
> Slip: '+slipL+', '+slipR)
> counter = 0
>  time.sleep(.1)
>
>
> # And now with an inline function
> def main():
>     file = open('file.txt')
>     counter = 0
>     while True:
> counter += 1
> frontL, frontR, backL, backR = getWheelSpeeds()
>  if counter > 100: # Log every 10 seconds no matter what
>  saveLine()
>  elif abs(frontR-backR) > 1 or abs(frontL-backL) > 1: # Also log if 
> the wheels are slipping
>  saveLine()
>  elif average([frontL, frontR, backL, backR]) > 60: # Also log if 
> we're going really fast
>  saveLine()
>  time.sleep(.1)
>
> inline def saveLine():
>     slipL = abs(frontL - backL)
>     slipR = abs(frontR - backR)
>     file.write('Speeds: ('+frontL+', '+frontR+', '+backL+', 
> '+backR+'), \n Slip: '+slipL+', '+slipR)
>     counter = 0
>
> What do you think?
>
In Python 3:

def main():
     def saveLine():
         nonlocal counter
         slipL = abs(frontL - backL)
         slipR = abs(frontR - backR)
         file.write('Speeds: ('+frontL+', '+frontR+', '+backL+', 
'+backR+'), \n Slip: '+slipL+', '+slipR)
         counter = 0

     file = open('file.txt')
     counter = 0
     while True:
         counter += 1
         frontL, frontR, backL, backR = getWheelSpeeds()
         if counter > 100: # Log every 10 seconds no matter what
             saveLine()
         elif abs(frontR-backR) > 1 or abs(frontL-backL) > 1: # Also log 
if the wheels are slipping
             saveLine()
         elif average([frontL, frontR, backL, backR]) > 60: # Also log 
if we're going really fast
             saveLine()
         time.sleep(.1)


> - Alex
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140205/8ba4ee58/attachment-0001.html>


More information about the Python-ideas mailing list