Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #105949

Re: List of Functions

From Chris Angelico <rosuav@gmail.com>
Newsgroups comp.lang.python
Subject Re: List of Functions
Date 2016-03-29 16:00 +1100
Message-ID <mailman.129.1459227615.28225.python-list@python.org> (permalink)
References (3 earlier) <87mvpjx9kh.fsf@elektro.pacujo.net> <ndb8ln$u0f$1@dont-email.me> <87twjqn2jn.fsf@elektro.pacujo.net> <mailman.116.1459201207.28225.python-list@python.org> <874mbpyjrf.fsf@elektro.pacujo.net>

Show all headers | View raw


On Tue, Mar 29, 2016 at 3:45 PM, Marko Rauhamaa <marko@pacujo.net> wrote:
> Chris Angelico <rosuav@gmail.com>:
>
>> On Tue, Mar 29, 2016 at 12:40 AM, Marko Rauhamaa <marko@pacujo.net> wrote:
>>> Dan Sommers <dan@tombstonezero.net>:
>>>
>>>> On Mon, 28 Mar 2016 11:58:54 +0300, Marko Rauhamaa wrote:
>>>>
>>>>> As for Python, I don't feel a great need for anonymous functions.
>>>>> However, I keep running into a need for anonymous classes, or,
>>>>> rather, classless objects. Not a biggie. I just create a one-off
>>>>> inner class and instantiate it, but I do appreciate Java's syntactic
>>>>> innovation.
>>>>
>>>> And I always curse Java for having to create an inner class and a
>>>> method when all I need is a simple function. :-)
>>>>
>>>> I think it's Steven D'Aprano who keeps pointing out that you can
>>>> always name your tiny helper functions instead of using lambda:
>>>>
>>>>     def some_complex_function():
>>>>         def f(x) = x + 2
>>>>         some_library_that_wants_a_callback(f)
>>>>         some_library_that_wants_a_callback(lambda x: x + 2)
>>>>
>>>> Both calls to some_library_that_wants_a_callback run the same.
>>>
>>> Yes, but I've come to realize that I quite often need more than a
>>> function: I need an object with behavior. The solution is to use a
>>> "helper" class.
>>
>> Can you give an example of code that would benefit from a
>> "lambda-class" construct?
>
> Here's a recent example:
>
> ========================================================================
>             def process(self, source):
>                 awk = self
>                 class Source(snake.FieldSource):
>                     def emit_fields(self):
>                         for fields in snake.get_fields(
>                                 source, awk.encoding, awk.errors,
>                                 awk.eol, awk.delim):
>                             if awk.selector is None or awk.selector(fields):
>                                 yield [ fields[i] for i in awk.columns ]
>                 return Source(self.encoding, self.errors, self.eol, self.delim)
> ========================================================================
>
> Here's another, older one:
>
> ========================================================================
>     def __init__(self, server, sock, domain, peer):
>         super().__init__(server, sock)
>         conn = self
>         client_ip = peer[0]
>
>         [...]
>
>         class SPF_HELO(STATE):
>             def terminate(self):
>                 conn.resume()
>                 conn.spf_query.cancel()
>                 conn.close()
>                 if conn.timer is not None:
>                     conn.timer.cancel()
>                     conn.timer = None
>                 conn.set_state(ZOMBIE)
>
>             def handle_spf_verdict(self, verdict, reason, *capabilities):
>                 conn.resume()
>                 conn.log("verdict {} reason {}".format(verdict, reason))
>                 # RFC 4408 ยง2.5.5 calls for leniency for SoftFail
>                 #if verdict in [ SPFClient.FAIL, SPFClient.SOFT_FAIL ]:
>                 if verdict in [ SPFClient.FAIL ]:
>                     conn.respond(550, "SPF check failed: {}".format(reason))
>                     conn.set_state(IDLE)
>                     return
>                 conn.respond(250, server.domain, *capabilities)
>                 conn.set_state(IDLE)
> ========================================================================

Since those functions have statements in them, there's not going to be
any way to construct this class as an expression (short of stupid
messing around with exec, which would be a bad idea). So the best
you're likely to be able to do is a metaclass or decorator that
short-hands the instantiation - or crafting your other code such that
it takes the class, rather than an instance of the class. The latter
is quite Pythonic, but generally not as well regarded in other
languages, sometimes for obvious reasons like "classes aren't first
class objects". :)

ChrisA

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

List of Functions Richard Riehle <rriehle@itu.edu> - 2016-03-27 12:38 -0700
  Re: List of Functions Erik <python@lucidity.plus.com> - 2016-03-28 00:10 +0100
  Re: List of Functions Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-03-28 01:19 +0100
    Re: List of Functions Jussi Piitulainen <jussi.piitulainen@helsinki.fi> - 2016-03-28 10:51 +0300
      Re: List of Functions Marko Rauhamaa <marko@pacujo.net> - 2016-03-28 11:58 +0300
        Re: List of Functions Dan Sommers <dan@tombstonezero.net> - 2016-03-28 12:39 +0000
          Re: List of Functions Marko Rauhamaa <marko@pacujo.net> - 2016-03-28 16:40 +0300
            Re: List of Functions Chris Angelico <rosuav@gmail.com> - 2016-03-29 08:40 +1100
              Re: List of Functions Steven D'Aprano <steve@pearwood.info> - 2016-03-29 09:52 +1100
                Re: List of Functions Chris Angelico <rosuav@gmail.com> - 2016-03-29 10:40 +1100
                Re: List of Functions Marko Rauhamaa <marko@pacujo.net> - 2016-03-29 07:49 +0300
              Re: List of Functions Marko Rauhamaa <marko@pacujo.net> - 2016-03-29 07:45 +0300
                Re: List of Functions Chris Angelico <rosuav@gmail.com> - 2016-03-29 16:00 +1100
      Re: List of Functions Steven D'Aprano <steve@pearwood.info> - 2016-03-29 10:40 +1100
        Re: List of Functions Random832 <random832@fastmail.com> - 2016-03-28 19:50 -0400
        Re: List of Functions Chris Angelico <rosuav@gmail.com> - 2016-03-29 10:54 +1100
        Re: List of Functions Rustom Mody <rustompmody@gmail.com> - 2016-03-28 19:23 -0700
        Re: List of Functions Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-03-29 03:45 +0100
          Re: List of Functions Chris Angelico <rosuav@gmail.com> - 2016-03-29 14:33 +1100
          Re: List of Functions Rustom Mody <rustompmody@gmail.com> - 2016-03-28 23:21 -0700
            Re: List of Functions Marko Rauhamaa <marko@pacujo.net> - 2016-03-29 09:50 +0300
            Re: List of Functions Christian Gollwitzer <auriocus@gmx.de> - 2016-03-29 08:52 +0200

csiph-web