How to check if resouce was allocated correctly in a python ContextDecorator?












0














I have a class



class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...


Now I want



with Resource() as r:
r.do_stuff()


But if r has failed to __enter__() successfully, this fails.



What is the correct, pythonic way of handling this?



I didn't want to use some is_allocated_correctly



like so



with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()


as it breaks the point of the with statement.



Please give me some idea what to do here.










share|improve this question






















  • assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
    – bruno desthuilliers
    Dec 27 at 13:53
















0














I have a class



class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...


Now I want



with Resource() as r:
r.do_stuff()


But if r has failed to __enter__() successfully, this fails.



What is the correct, pythonic way of handling this?



I didn't want to use some is_allocated_correctly



like so



with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()


as it breaks the point of the with statement.



Please give me some idea what to do here.










share|improve this question






















  • assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
    – bruno desthuilliers
    Dec 27 at 13:53














0












0








0







I have a class



class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...


Now I want



with Resource() as r:
r.do_stuff()


But if r has failed to __enter__() successfully, this fails.



What is the correct, pythonic way of handling this?



I didn't want to use some is_allocated_correctly



like so



with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()


as it breaks the point of the with statement.



Please give me some idea what to do here.










share|improve this question













I have a class



class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...


Now I want



with Resource() as r:
r.do_stuff()


But if r has failed to __enter__() successfully, this fails.



What is the correct, pythonic way of handling this?



I didn't want to use some is_allocated_correctly



like so



with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()


as it breaks the point of the with statement.



Please give me some idea what to do here.







python python-3.x exception with-statement contextmanager






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Dec 27 at 13:32









Gulzar

7511520




7511520












  • assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
    – bruno desthuilliers
    Dec 27 at 13:53


















  • assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
    – bruno desthuilliers
    Dec 27 at 13:53
















assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
– bruno desthuilliers
Dec 27 at 13:53




assuming the resource is allocated either in the __init__ or __enter__ AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource class, then you will NEVER enter the with block if the resource is not "correctly allocated". IOW, you have nothing special to do.
– bruno desthuilliers
Dec 27 at 13:53












1 Answer
1






active

oldest

votes


















1














The purpose of the with statement is correctly de-allocate resources or reset state after the block has finished.



If you can't enter the context block without an error, that needs handling outside of the with statement.



Surround the whole thing with a try/except:



try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)


Or if there's nothing you can do about the error, just let it pass:



with Resource() as r:
r.do_stuff()





share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53945943%2fhow-to-check-if-resouce-was-allocated-correctly-in-a-python-contextdecorator%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    The purpose of the with statement is correctly de-allocate resources or reset state after the block has finished.



    If you can't enter the context block without an error, that needs handling outside of the with statement.



    Surround the whole thing with a try/except:



    try:
    with Resource() as r:
    r.do_stuff()
    except ResourceException as error:
    handle_error(error)


    Or if there's nothing you can do about the error, just let it pass:



    with Resource() as r:
    r.do_stuff()





    share|improve this answer


























      1














      The purpose of the with statement is correctly de-allocate resources or reset state after the block has finished.



      If you can't enter the context block without an error, that needs handling outside of the with statement.



      Surround the whole thing with a try/except:



      try:
      with Resource() as r:
      r.do_stuff()
      except ResourceException as error:
      handle_error(error)


      Or if there's nothing you can do about the error, just let it pass:



      with Resource() as r:
      r.do_stuff()





      share|improve this answer
























        1












        1








        1






        The purpose of the with statement is correctly de-allocate resources or reset state after the block has finished.



        If you can't enter the context block without an error, that needs handling outside of the with statement.



        Surround the whole thing with a try/except:



        try:
        with Resource() as r:
        r.do_stuff()
        except ResourceException as error:
        handle_error(error)


        Or if there's nothing you can do about the error, just let it pass:



        with Resource() as r:
        r.do_stuff()





        share|improve this answer












        The purpose of the with statement is correctly de-allocate resources or reset state after the block has finished.



        If you can't enter the context block without an error, that needs handling outside of the with statement.



        Surround the whole thing with a try/except:



        try:
        with Resource() as r:
        r.do_stuff()
        except ResourceException as error:
        handle_error(error)


        Or if there's nothing you can do about the error, just let it pass:



        with Resource() as r:
        r.do_stuff()






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 27 at 13:41









        Peter Wood

        16.2k33268




        16.2k33268






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53945943%2fhow-to-check-if-resouce-was-allocated-correctly-in-a-python-contextdecorator%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Monofisismo

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas