qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: Wainer dos Santos Moschetta <wainersm@redhat.com>, qemu-devel@nongnu.org
Cc: philmd@redhat.com, ehabkost@redhat.com, crosa@redhat.com
Subject: Re: [PATCH v2 4/5] python/qemu: qmp: Make QEMUMonitorProtocol a context manager
Date: Wed, 5 Feb 2020 18:43:35 -0500	[thread overview]
Message-ID: <55c479f8-d24a-1ea7-52d5-d0dba7f4afb5@redhat.com> (raw)
In-Reply-To: <20200204141111.3207-5-wainersm@redhat.com>



On 2/4/20 9:11 AM, Wainer dos Santos Moschetta wrote:
> This implement the __enter__ and __exit__ functions on
> QEMUMonitorProtocol class so that it can be used on 'with'
> statement and the resources will be free up on block end:
> 
> with QEMUMonitorProtocol(socket_path) as qmp:
>     qmp.connect()
>     qmp.command('query-status')
> 
> Signed-off-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
> ---
>  python/qemu/qmp.py | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
> index 0e07d80e2a..486a566da0 100644
> --- a/python/qemu/qmp.py
> +++ b/python/qemu/qmp.py
> @@ -139,6 +139,15 @@ class QEMUMonitorProtocol:
>                  raise QMPConnectError("Error while reading from socket")
>              self.__sock.settimeout(None)
>  
> +    def __enter__(self):
> +        # Implement context manager enter function.
> +        return self
> +
> +    def __exit__(self, exc_type, exc_value, exc_traceback):
> +        # Implement context manager exit function.
> +        self.close()
> +        return False
> +
>      def connect(self, negotiate=True):
>          """
>          Connect to the QMP Monitor and perform capabilities negotiation.
> @@ -265,8 +274,10 @@ class QEMUMonitorProtocol:

Can we teach git to give better context for python?

What function is this part of?
(Rhetorical, do not shame me with answers.)

Default git configuration for python is bad. Can it be less bad?

> git diff
diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
index 20e1e6ce86..aa73fc0b71 100644
--- a/python/qemu/qmp.py
+++ b/python/qemu/qmp.py
@@ -246,8 +246,10 @@ class QEMUMonitorProtocol(object):
         """
         foo
         """
-        self.__sock.close()
-        self.__sockfile.close()
+        if self.__sock:
+            self.__sock.close()
+        if self.__sockfile:
+            self.__sockfile.close()


Apparently if you edit .git/info/attributes to add this:
`*.py diff=python`

The diffs will look like this instead:

> git diff
diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
index 20e1e6ce86..aa73fc0b71 100644
--- a/python/qemu/qmp.py
+++ b/python/qemu/qmp.py
@@ -246,8 +246,10 @@ def close(self):
         """
         foo
         """
-        self.__sock.close()
-        self.__sockfile.close()
+        if self.__sock:
+            self.__sock.close()
+        if self.__sockfile:
+            self.__sockfile.close()

     def settimeout(self, timeout):
         self.__sock.settimeout(timeout)


That's... better, but now it doesn't show the class anymore :(


>          """
>          Close the socket and socket file.
>          """
> -        self.__sock.close()
> -        self.__sockfile.close()
> +        if self.__sock:
> +            self.__sock.close()
> +        if self.__sockfile:
> +            self.__sockfile.close()
>  
>      def settimeout(self, timeout):
>          """
> 

You've designed it to be thrown away as a context object, but close() is
left as a public method you *could* call multiple times if you wanted to.

"Well, don't do that", but that was the nature of me asking why you were
guarding these values; and under what circumstances you expected to need
to guard them.

"Because they aren't defined on __enter__ and we need to not try to
close then on __exit__" is valid.

Reviewed-by: John Snow <jsnow@redhat.com>



  reply	other threads:[~2020-02-05 23:44 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-04 14:11 [PATCH v2 0/5] python/qemu: qmp: Fix, delint and improvements Wainer dos Santos Moschetta
2020-02-04 14:11 ` [PATCH v2 1/5] python/qemu: qmp: Replace socket.error with OSError Wainer dos Santos Moschetta
2020-02-04 14:11 ` [PATCH v2 2/5] python/qemu: Delint the qmp module Wainer dos Santos Moschetta
2020-02-04 14:11 ` [PATCH v2 3/5] python/qemu: qmp: Make accept()'s timeout configurable Wainer dos Santos Moschetta
2020-02-05 23:28   ` John Snow
2020-02-04 14:11 ` [PATCH v2 4/5] python/qemu: qmp: Make QEMUMonitorProtocol a context manager Wainer dos Santos Moschetta
2020-02-05 23:43   ` John Snow [this message]
2020-02-04 14:11 ` [PATCH v2 5/5] python/qemu: qmp: Remove unnused attributes Wainer dos Santos Moschetta
2020-02-06 14:52 ` [PATCH v2 0/5] python/qemu: qmp: Fix, delint and improvements Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55c479f8-d24a-1ea7-52d5-d0dba7f4afb5@redhat.com \
    --to=jsnow@redhat.com \
    --cc=crosa@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=wainersm@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).