Python 3/Kontekstimanageri


Kontekstimanageri (context manager) on olio, joka avaa ja sulkee jonkin resurssin hallitusti. Yhteen kontekstimanageriin tutustuttiin jo tiedostojen käsittelyn yhteydessä. Kontekstimanageri avaa resurssin lohkon alussa ja sulkee sen aina lohkosta poistuttaessa tapahtui poistuminen miten tahansa (lohkon loputtua, return-, break- tai continue-lauseella tai virheen sattuessa). Konteksti avataan with-avainsanalla ja sen palauttama arvo asetetaan muuttujaan as-avainsanalla. Oliota voidaan käyttää kontekstimanagerina, jos se toteuttaa metodit __enter__(self) ja __exit__(self, type, value, traceback).

Esimerkki muokkaa

Alla olevassa esimerkissä kirjaudutaan sisään johonkin palveluun, palvelua käytetään lohkon sisällä ja lopuksi kirjaudutaan ulos.

class ApiSessio:
    def __init__(self, käyttäjätunnus, salasana):
        self.käyttäjätunnus = käyttäjätunnus
        self.salasana = salasana
        
    def __enter__(self):
        print(f"[ApiSessio] Käyttäjä ’{self.käyttäjätunnus}’ kirjautuu salasanalla ’{self.salasana}’")
        return self
    
    def __exit__(self, type, value, traceback):
        print(f"[ApiSessio] Käyttäjä ’{self.käyttäjätunnus}’ kirjautuu ulos")
        
    def hae_tieto(self):
        return "Palvelusta haettu tieto"


if __name__ == "__main__":
    with ApiSessio('käyttäjä1', 'salasana22!') as sessio:
        print(sessio.hae_tieto())

Tulostaa

[ApiSessio] käyttäjä ’käyttäjä1’ kirjautuu salasanalla ’salasana22!’
Palvelusta haettu tieto
[ApiSessio] Käyttäjä ’käyttäjä1’ kirjautuu ulos

Jos lohkon sisällä nyt tapahtuisi odottamaton virhe, kirjauduttaisiin silti ulos.

[ApiSessio] käyttäjä ’käyttäjä1’ kirjautuu salasanalla ’salasana22!’
[ApiSessio] Käyttäjä ’käyttäjä1’ kirjautuu ulos
Traceback (most recent call last):
...
Exception: Tapahtui virhe

Harjoitukset muokkaa