C-like assignment expression?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Kay Schluehr

    #16
    Re: C-like assignment expression?

    On 21 Mai, 11:38, boblat...@googl email.com wrote:
    Hello,
    >
    I have an if-elif chain in which I'd like to match a string against
    several regular expressions. Also I'd like to use the match groups
    within the respective elif... block. The C-like idiom that I would
    like to use is this:
    >
    if (match = my_re1.match(li ne):
    # use match
    elsif (match = my_re2.match(li ne)):
    # use match
    elsif (match = my_re3.match(li ne))
    # use match
    >
    ...buy this is illegal in python. The other way is to open up an else:
    block in each level, do the assignment and then the test. This
    unneccessarily leads to deeper and deeper nesting levels which I find
    ugly. Just as ugly as first testing against the RE in the elif: clause
    and then, if it matches, to re-evaluate the RE to access the match
    groups.
    >
    Thanks,
    robert
    You are perfectly correct. Pythons design is lacking here IMO. But
    what is your question?

    Comment

    • inhahe

      #17
      Re: C-like assignment expression?


      <cokofreedom@gm ail.comwrote in message
      news:06ea8b72-598e-4455-b3f9-e614ddb6ad94@p2 5g2000hsf.googl egroups.com...
      On May 21, 4:57 pm, "inhahe" <inh...@gmail.c omwrote:
      >one of the few things i miss from C is being able to use assignment in
      >expressions. that's the only thing, really.
      >also there's no switch/case, you have to use a dictionary of functions
      >instead, although i rarely need that, usually i just use elif.
      >
      One thing I hate from C is the assignment in expressions...F orcing
      myself to write
      0 == Something
      rather than
      Something == 0
      interesting trick, i've never thought of that/seen it
      although if Python implemented it I think it should default to giving
      warnings when you use = in an expression, that way you don't have to worry.
      just to make sure I was mistakenly assigning values in statements is
      annoying, it ruins the ease of reading.
      >
      I kind of agree with the select:case, but I think a key issue is how
      to implement it. Elif is reasonable for now.
      >
      Diez, true I guess, but then we haven't seen what these expressions
      are, and why there has to be three.

      Comment

      • inhahe

        #18
        Re: C-like assignment expression?

        >>
        >One thing I hate from C is the assignment in expressions...F orcing
        >myself to write
        >0 == Something
        >rather than
        >Something == 0
        >
        interesting trick, i've never thought of that/seen it
        although if Python implemented it I think it should default to giving
        warnings when you use = in an expression, that way you don't have to
        worry.
        >
        That introduces complications though, do you want to see a pagefull of
        warnings every time you import a module that uses the ='s?
        You could specify in your python file that you want to suppress that
        warning, but then you'd never know when you used = by accident when you
        meant to use ==.
        anyway i was thinking you could have a second assignment operator to use
        just in expressions, and only allow that. it could be := since some
        languages tend to use that. i wouldn't like it as a general assignment
        operator but assignment in expressions is a special case. also <- or ->.
        C uses -for functions but I think math/calculators use that for
        assignment.




        Comment

        • MRAB

          #19
          Re: C-like assignment expression?

          On May 21, 5:50 pm, "inhahe" <inh...@gmail.c omwrote:
          One thing I hate from C is the assignment in expressions...F orcing
          myself to write
          0 == Something
          rather than
          Something == 0
          >
          interesting trick, i've never thought of that/seen it
          although if Python implemented it I think it should default to giving
          warnings when you use = in an expression, that way you don't have to
          worry.
          >
          That introduces complications though, do you want to see a pagefull of
          warnings every time you import a module that uses the ='s?
          You could specify in your python file that you want to suppress that
          warning, but then you'd never know when you used = by accident when you
          meant to use ==.
          anyway i was thinking you could have a second assignment operator to use
          just in expressions, and only allow that. it could be := since some
          languages tend to use that. i wouldn't like it as a general assignment
          operator but assignment in expressions is a special case. also <- or ->.
          C uses -for functions but I think math/calculators use that for
          assignment.
          My preference would be ?=.

          if match ?= my_re1.match(li ne):
          # use match
          elif match ?= my_re2.match(li ne):
          # use match
          elif match ?= my_re3.match(li ne):
          # use match

          Comment

          • sturlamolden

            #20
            Re: C-like assignment expression?

            On May 21, 11:38 am, boblat...@googl email.com wrote:
            if (match = my_re1.match(li ne):
            # use match
            elsif (match = my_re2.match(li ne)):
            # use match
            elsif (match = my_re3.match(li ne))
            # use match
            >
            ...buy this is illegal in python.

            Assignment expressions is disallowed in Python to protect against a
            very common bug in C/C++ programs, the (accidental) confusion of

            if (match = my_re1.match(li ne))

            with

            if (match == my_re1.match(li ne))

            or vice versa.








            Comment

            • Paddy

              #21
              Re: C-like assignment expression?

              On May 21, 10:38 am, boblat...@googl email.com wrote:
              Hello,
              >
              I have an if-elif chain in which I'd like to match a string against
              several regular expressions. Also I'd like to use the match groups
              within the respective elif... block. The C-like idiom that I would
              like to use is this:
              >
              if (match = my_re1.match(li ne):
              # use match
              elsif (match = my_re2.match(li ne)):
              # use match
              elsif (match = my_re3.match(li ne))
              # use match
              >
              ...buy this is illegal in python. The other way is to open up an else:
              block in each level, do the assignment and then the test. This
              unneccessarily leads to deeper and deeper nesting levels which I find
              ugly. Just as ugly as first testing against the RE in the elif: clause
              and then, if it matches, to re-evaluate the RE to access the match
              groups.
              >
              Thanks,
              robert
              You could use named groups to search for all three patterns at once
              like this:


              original:

              prog1 = re.compile(r'pa t1')
              prog2 = re.compile(r'pa t2')
              prog3 = re.compile(r'pa t3')
              ...

              Becomes:

              prog = re.compile(r'(? P<p1>pat1)|(?P< p2>pat2)|(?P<p3 >pat3)')
              match = prog.match(line )
              for p in 'p1 p2 p3'.split():
              if match.groupdict ()[p]:
              do_something_fo r_prog(p)


              - Paddy.

              Comment

              • Kay Schluehr

                #22
                Re: C-like assignment expression?

                On 21 Mai, 19:56, sturlamolden <sturlamol...@y ahoo.nowrote:
                On May 21, 11:38 am, boblat...@googl email.com wrote:
                >
                if (match = my_re1.match(li ne):
                # use match
                elsif (match = my_re2.match(li ne)):
                # use match
                elsif (match = my_re3.match(li ne))
                # use match
                >
                ...buy this is illegal in python.
                >
                Assignment expressions is disallowed in Python to protect against a
                very common bug in C/C++ programs, the (accidental) confusion of
                >
                if (match = my_re1.match(li ne))
                >
                with
                >
                if (match == my_re1.match(li ne))
                >
                or vice versa.
                This is just a syntactical issue. But what is the *value* of an
                assigment? In Python it is always None: assigments are statements, not
                expressions.

                However Guido and team have found a *pragmatic* solution for this at
                another place:

                with open("myFile") as f:
                BLOCK

                Compare this with a possible syntactical form of an if-statement:

                if EXPR as NAME:
                BLOCK

                This isn't ugly syntax-wise. It's just a bit harder to understand the
                semantics of an if-statement. It might read like this:

                "Evaluate EXPR and compute bool(EXPR). If this value is True assign
                EXPR to NAME and execute BLOCK. Otherwise refuse both assigment and
                BLOCK execution."

                Maybe assignment can be performed unconditionally as in the C case.
                I'm not sure about this.

                Comment

                • Antoon Pardon

                  #23
                  Re: C-like assignment expression?

                  On 2008-05-21, Diez B. Roggisch <deets@nospam.w eb.dewrote:
                  boblatest@googl email.com wrote:
                  >
                  >On May 21, 1:47 pm, Hrvoje Niksic <hnik...@xemacs .orgwrote:
                  >>
                  >>Although that solution is pretty, it is not the canonical solution
                  >>because it doesn't cover the important case of "if" bodies needing to
                  >>access common variables in the enclosing scope. (This will be easier
                  >>in Python 3 with 'nonlocal', though.) The snippet posted by Diez is
                  >>IMHO closer to a canonical solution to this FAQ.
                  >>
                  >Hello everybody,
                  >>
                  >thanks for the various answers. I'm actually pretty puzzled because I
                  >expected to see some obvious solution that I just hadn't found before.
                  >In general I find Python more elegant and syntactically richer than C
                  >(that's where I come from), so I didn't expect the solutions to be a
                  >lot more verbose and/or ugly (no offense) than the original idea which
                  >would have worked if Python's assignment statement would double as
                  >expression, as in C.
                  >
                  Well, it's a design-decision - and I'm pretty ok with it being a bit verbose
                  here - as it prevents a *great* deal of programming errors that would
                  otherwise happen from accidentally writing a = b where a == b was meant.
                  But that is an error that occurs because of the specific symbols chosen
                  to represent an assignment or equality test. At the time python was
                  first designed, other symbols for assignment were already used for
                  in other languages, like := and <-

                  So if preventing errors was the main motivation why not allow an
                  assignment to be an expression but use a symbol for the assignment
                  that would prevent those kind of errors?

                  I find it hard to believe that a design choice like whether or not
                  to have the assignment behave as an expression or not, was decided
                  on the ground of a particulare lexical representation of the assignment
                  symbol.

                  --
                  Antoon Pardon

                  Comment

                  • Paul McGuire

                    #24
                    Re: C-like assignment expression?

                    On May 21, 4:38 am, boblat...@googl email.com wrote:
                    Hello,
                    >
                    I have an if-elif chain in which I'd like to match a string against
                    several regular expressions. Also I'd like to use the match groups
                    within the respective elif... block. The C-like idiom that I would
                    like to use is this:
                    >
                    if (match = my_re1.match(li ne):
                      # use match
                    elsif (match = my_re2.match(li ne)):
                      # use match
                    elsif (match = my_re3.match(li ne))
                      # use match
                    >
                    ...buy this is illegal in python. The other way is to open up an else:
                    block in each level, do the assignment and then the test. This
                    unneccessarily leads to deeper and deeper nesting levels which I find
                    ugly. Just as ugly as first testing against the RE in the elif: clause
                    and then, if it matches, to re-evaluate the RE to access the match
                    groups.
                    >
                    Thanks,
                    robert
                    Try this.

                    -- Paul

                    class TestValue(objec t):
                    """Class to support assignment and test in single operation"""
                    def __init__(self,v =None):
                    self.value = v

                    """Add support for quasi-assignment syntax using '<<' in place of
                    '='."""
                    def __lshift__(self ,other):
                    self.value = other
                    return bool(self.value )


                    import re

                    tv = TestValue()
                    integer = re.compile(r"[-+]?\d+")
                    real = re.compile(r"[-+]?\d*\.\d+")
                    word = re.compile(r"\w +")

                    for inputValue in ("123 abc 3.1".split()):
                    if (tv << real.match(inpu tValue)):
                    print "Real", float(tv.value. group())
                    elif (tv << integer.match(i nputValue)):
                    print "Integer", int(tv.value.gr oup())
                    elif (tv << word.match(inpu tValue)):
                    print "Word", tv.value.group( )

                    Prints:

                    Integer 123
                    Word abc
                    Real 3.1


                    Comment

                    • Paul McGuire

                      #25
                      Re: C-like assignment expression?

                      This version is a bit better, since it follows the convention that
                      '<<' should return self.

                      class TestValue(objec t):
                      """Class to support assignment and test in single operation"""
                      def __init__(self,v =None):
                      self.value = v

                      """Add support for quasi-assignment syntax using '<<' in place of
                      '='."""
                      def __lshift__(self ,other):
                      self.value = other
                      return self

                      def __bool__(self):
                      return bool(self.value )
                      __nonzero__ = __bool__

                      -- Paul

                      Comment

                      Working...