Python Feature Request: Add the "using" keyword which works like "with" in Visual Basic

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • =?ISO-8859-1?Q?BJ=F6rn_Lindqvist?=

    #16
    Re: Python Feature Request: Add the "using&quo t; keyword which works like"with& quot; in Visual Basic

    On 4/14/07, BJörn Lindqvist <bjourne@gmail. comwrote:
    On 14 Apr 2007 07:24:32 -0700, jamadagni <samjnaa@gmail. comwrote:
    You already can emulate the using statement like this:
    You can emulate only assignments like this. How would you emulate
    function calls, like the ones in my example?
    >
    You can't, of course. But using the with statement:
    >
    using self.q:
    .doit()
    >
    becomes:
    >
    with self.quit as q:
    q.doit()
    Er.. I guess there are some details you need to work out for that. But
    in principle, it works fine.

    --
    mvh Björn

    Comment

    • 7stud

      #17
      Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

      On Apr 14, 4:42 am, samj...@gmail.c om wrote:
      This also is
      similar to the C++ "using" keyword which exposes the members of a
      namespace to access without specifying the namespace scope for each
      reference. For example after giving "using namespace std;" I can
      change all references to "std::cout" to "cout", which is similar to
      what I am proposing for Python now.
      >
      ....which is a bad practice in C++. When you expose the members of a
      namespace, you create the potential for name clashes with the names in
      your program. Why would you want to infect Python with that problem?

      Comment

      • 7stud

        #18
        Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

        On Apr 14, 12:57 pm, "7stud" <bbxx789_0...@y ahoo.comwrote:
        On Apr 14, 4:42 am, samj...@gmail.c om wrote:
        >
        This also is
        similar to the C++ "using" keyword which exposes the members of a
        namespace to access without specifying the namespace scope for each
        reference. For example after giving "using namespace std;" I can
        change all references to "std::cout" to "cout", which is similar to
        what I am proposing for Python now.
        >
        ...which is a bad practice in C++. When you expose the members of a
        namespace, you create the potential for name clashes with the names in
        your program. Why would you want to infect Python with that problem?
        Oh. James Stroud's recommendation would fix that:
        I would favor a convention with leading dots
        to disambiguate from other variables.

        Comment

        • Georg Brandl

          #19
          Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like&quot;with& quot; in Visual Basic

          BJörn Lindqvist schrieb:
          On 4/14/07, BJörn Lindqvist <bjourne@gmail. comwrote:
          >On 14 Apr 2007 07:24:32 -0700, jamadagni <samjnaa@gmail. comwrote:
          You already can emulate the using statement like this:
          >
          You can emulate only assignments like this. How would you emulate
          function calls, like the ones in my example?
          >>
          >You can't, of course. But using the with statement:
          >>
          >using self.q:
          > .doit()
          >>
          >becomes:
          >>
          >with self.quit as q:
          > q.doit()
          Er.. I guess there are some details you need to work out for that. But
          in principle, it works fine.
          No, it does not. The "q" here is *not* assigned to self.quit, but to the
          result of self.quit.__ent er__().

          Georg


          --
          Thus spake the Lord: Thou shalt indent with four spaces. No more, no less.
          Four shall be the number of spaces thou shalt indent, and the number of thy
          indenting shall be four. Eight shalt thou not indent, nor either indent thou
          two, excepting that thou then proceed to four. Tabs are right out.

          Comment

          • Bjoern Schliessmann

            #20
            Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

            jamadagni wrote:
            Bjoern Schliessmann wrote:
            >In more complex modules, when you are
            >looking for, e. g., self.myVar and anotherObject.m yVar,
            >this "using" statement decreases readability and maintainability
            >(in full text searching). IMHO.
            >
            Why? Just search for self and you turn up using self. Just scan
            down (the block) and you get myVar. Similarly for
            anotherObject.m yVar.
            It seems to me that the biggest module you've ever written has less
            than 100 lines.
            Of course, you lose the possibility of just searching for
            self.myVar -- something lost, something gained, IMHO.
            So, the gain is the loss of something different? If you say so.

            IMHO, the ability to find something quickly weighs much stronger
            than needing to write 5 characters more. After all, working on the
            code doesn't mean writing new stuff all the time, but modifying and
            extending the existing code. A few characters more can enhance
            readability vastly. IMHO.

            Regards,


            Björn

            --
            BOFH excuse #261:

            The Usenet news is out of date

            Comment

            • Terry Reedy

              #21
              Re: Python Feature Request: Add the &quot;using&quo t; keyword which workslike&quot; with&quot; in Visual Basic


              <samjnaa@gmail. comwrote in message
              news:1176547372 .584539.89170@q 75g2000hsh.goog legroups.com...
              | self.setFixedSi ze(200, 120)
              | self.quit = QtGui.QPushButt on("Quit", self)
              | self.quit.setGe ometry(62, 40, 75, 30)
              | self.quit.setFo nt(QtGui.QFont( "Times", 18, QtGui.QFont.Bol d))
              | self.connect(se lf.quit, QtCore.SIGNAL(" clicked()"), QtGui.qApp,
              | QtCore.SLOT("qu it()"))
              |
              | to be rewritten as:
              |
              | using self:
              | __setFixedSize( 200,120)
              | __quit = QtGui.QPushButt on("Quit", self)
              | __using quit:
              | ____setGeometry (62, 40, 75, 30)
              | ____setFont(QtG ui.QFont("Times ", 18, QtGui.QFont.Bol d))
              | __connect(self. quit, QtCore.SIGNAL(" clicked()"), QtGui.qApp,
              | QtCore.SLOT("qu it()"))

              If you want to save typing, you are free to use 's' instead of 'self' as
              the parameter name. No need to make a fairly major language change.

              I do things like 'import math as m' to save repetition.

              tjr



              Comment

              • jamadagni

                #22
                Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

                On Apr 15, 2:01 am, Bjoern Schliessmann <usenet-
                mail-0306.20.chr0n.. .@spamgourmet.c omwrote:
                self.myVar -- something lost, something gained, IMHO.
                >
                So, the gain is the loss of something different? If you say so.
                My mistake - I should have said "no pain, no gain".
                IMHO, the ability to find something quickly weighs much stronger
                than needing to write 5 characters more.
                Five characters more how many times?

                Comment

                • Steven D'Aprano

                  #23
                  Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

                  On Sat, 14 Apr 2007 03:42:52 -0700, samjnaa wrote:
                  Please check for sanity and approve for posting at python-dev.
                  >
                  In Visual Basic there is the keyword "with" which allows an object-
                  name to be declared as governing the following statements. For
                  example:
                  >
                  with quitCommandButt on
                  .enabled = true
                  .default = true
                  end with
                  >
                  This is syntactic sugar for:
                  >
                  quitCommandButt on.enabled=true
                  quitCommandButt on.default=true
                  Which is very much like Pascal's with block.

                  This question has been asked before:



                  Despite what the Effbot says, I believe that there is no ambiguity that
                  can't be resolved.

                  Specifying that names used in a using-block have a leading dot makes it
                  obvious to the compiler which names are shortened:

                  using longname:
                  x = .attribute # must be longname.attrib ute


                  If we forbid nested using-blocks, then all you need is a pre-processor to
                  change ".attribute " to "longname.attri bute". There's never any ambiguity.

                  But if you want to be really ambitious, one might allow nested
                  using-blocks. Now the compiler can't resolve names with leading dots at
                  parse-time, and has to search namespaces at runtime, but that's no
                  different from what Python already does.


                  using longname:
                  using anotherlongname :
                  x = .attr

                  In this case, at Python has to determine at runtime which object has an
                  attribute "attr". If that sounds familiar, it should: that's exactly what
                  happens when you say instance.attrib ute: Python searches
                  instance.__dict __ then instance.__clas s__.__dict__, and any superclasses.

                  There is one slight ambiguity left: should Python search longname first or
                  anotherlongname ? But that decision has come up before, for nested scopes
                  in functions. It seems obvious to me that Python should search deepest to
                  most shallow, the same way that function nested scopes work.

                  So the above nested block would be equivalent to:

                  try:
                  x = anotherlongname .attr
                  except AttributeError:
                  try:
                  x = longname.attr
                  except AttributeError:
                  raise UsingError('no such attribute')


                  One might even allow a construct like this:

                  using longname, anotherlongname :
                  x = .attr

                  In this case, the search resolution order would be from left to right,
                  that is, longname before anotherlongname .



                  --
                  Steven.

                  Comment

                  • Colin J. Williams

                    #24
                    Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like&quot;with& quot; in Visual Basic

                    James Stroud wrote:
                    samjnaa@gmail.c om wrote:
                    >Please check for sanity and approve for posting at python-dev.
                    >>
                    >In Visual Basic there is the keyword "with" which allows an object-
                    >name to be declared as governing the following statements. For
                    >example:
                    >>
                    >with quitCommandButt on
                    > .enabled = true
                    > .default = true
                    >end with
                    >>
                    >This is syntactic sugar for:
                    >>
                    >quitCommandBut ton.enabled=tru e
                    >quitCommandBut ton.default=tru e
                    >>
                    >This can be very useful especially in GUI programming when we have to
                    >type the same object name in line-after-line. I personally found
                    >having to type the word "self" umpteen times inside classes very
                    >irritating. Such a beautiful language is Python, she should have this
                    >good feature from VB too.
                    >>
                    >Now I hear that the word "with" is being discussed for a different
                    >purpose in Py 3 as a result of a PEP and I don't want to conflict with
                    >that. So I propose the word "using" as a replacement. This also is
                    >similar to the C++ "using" keyword which exposes the members of a
                    >namespace to access without specifying the namespace scope for each
                    >reference. For example after giving "using namespace std;" I can
                    >change all references to "std::cout" to "cout", which is similar to
                    >what I am proposing for Python now.
                    >>
                    >Some thoughts about how this "using" statement should behave. The word
                    >using should be followed by an object name and a colon indicating the
                    >start of a block. The object named after "using" must determine the
                    >context (or whatever the technical word is) of the of the statements
                    >in that block.
                    >>
                    >self.setFixedS ize(200, 120)
                    >self.quit = QtGui.QPushButt on("Quit", self)
                    >self.quit.setG eometry(62, 40, 75, 30)
                    >self.quit.setF ont(QtGui.QFont ("Times", 18, QtGui.QFont.Bol d))
                    >self.connect(s elf.quit, QtCore.SIGNAL(" clicked()"), QtGui.qApp,
                    >QtCore.SLOT("q uit()"))
                    >>
                    >to be rewritten as:
                    >>
                    >using self:
                    >__setFixedSize (200,120)
                    >__quit = QtGui.QPushButt on("Quit", self)
                    >__using quit:
                    >____setGeometr y(62, 40, 75, 30)
                    >____setFont(Qt Gui.QFont("Time s", 18, QtGui.QFont.Bol d))
                    >__connect(self .quit, QtCore.SIGNAL(" clicked()"), QtGui.qApp,
                    >QtCore.SLOT("q uit()"))
                    >>
                    >[I don't know whether usenet will retain my indenting, so I changed
                    >the tabs to underscores.]
                    >>
                    >This context governing may need to be limited to the first applicable
                    >member - so that in the above example "self" governs setFixedSize,
                    >quit, quit and connect only in each sentence and quit (self.quit)
                    >governs setGeometry and setFont only. (Point is that the parser should
                    >not search for self.QtGui, self.self or self.QtCore in sentences 3 and
                    >7, and self.quit.QtGui in sentence 6.)
                    >>
                    >Due to my absence of professional experience, my request may be
                    >somewhat unpolished technical-wise, but I believe that this is a very
                    >useful feature for Python and hence request the technically-
                    >knowledgeabl e to reformat it as necessary. Thank you.
                    >>
                    >
                    I like this one for some reason. Just the "using self" would save hella
                    typing in a lot of classes. I would favor a convention with leading dots
                    to disambiguate from other variables. This wouldn't conflict with, say,
                    floats, because variable names can't begin with a number.
                    >
                    James
                    Yes, I like the idea too. It has deeper roots than Visual Basic. In
                    Pascal, Nicklaus Wirth used "with" for record access.

                    It's an idea that can be used with any object which has attributes.
                    The value of an attribute could be a function or a class.

                    It's a pity that the word "with" was used for a context declaration -
                    PEP 343. On the other hand, I believe "using" has been suggested as
                    an alternative, that seems a reasonable alternative.

                    Colin W.

                    Comment

                    • Paul Boddie

                      #25
                      Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

                      samjnaa@gmail.c om wrote:
                      Please check for sanity and approve for posting at python-dev.
                      Technically, you can post it yourself to python-dev, but you'll just
                      get bounced back here to discuss it with us. ;-)
                      In Visual Basic there is the keyword "with" which allows an object-
                      name to be declared as governing the following statements. For
                      example:
                      >
                      with quitCommandButt on
                      .enabled = true
                      .default = true
                      end with
                      This is how the discussion started for the current "with" statement,
                      although it ended up doing something somewhat different.

                      [...]
                      Now I hear that the word "with" is being discussed for a different
                      purpose in Py 3 as a result of a PEP and I don't want to conflict with
                      that.
                      The "with" keyword appears in 2.5 onwards.

                      Paul

                      Comment

                      • Alex Martelli

                        #26
                        Re: Python Feature Request: Add the &quot;using&quo t; keyword which works like &quot;with&quot ; in Visual Basic

                        Paul Boddie <paul@boddie.or g.ukwrote:
                        Now I hear that the word "with" is being discussed for a different
                        purpose in Py 3 as a result of a PEP and I don't want to conflict with
                        that.
                        >
                        The "with" keyword appears in 2.5 onwards.
                        ....but needs a "from __future__ import with_statement" in 2.5 itself.


                        Alex

                        Comment

                        Working...