Python Academy · Oppitunti

Oletusarvot ja field()

Asettakaa oletusarvot ja käyttäkää field()-asetuksia.

Oppitunti 2/413 vaihetta

Oletusarvot ja field() on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Kenttien oletusarvojen määrittäminen

Aivan kuten funktion parametreilla, myös dataclass-kentillä voi olla oletusarvoja. Oletusarvon sisältävä kenttä voidaan jättää pois ilmentymää luotaessa.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

Järjestyksellä on väliä

Oletusarvon sisältävien kenttien on oltava oletusarvottomien kenttien jälkeen aivan kuten funktioargumenteissa. Muussa tapauksessa Python nostaa TypeError-virheen luokan määrittelyn yhteydessä.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

Muuttuvan oletusarvon sudenkuoppa

Muuttuvaa oliota, kuten listaa tai sanakirjaa, ei voi käyttää suoraan oletusarvona. Tällöin kaikki ilmentymät jakaisivat saman olion. Python havaitsee tämän ja nostaa ValueError-virheen suojatakseen teitä.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Antakaa muuttuvalle kentälle oletusarvo käyttämällä field(default_factory=...)-määritystä. Tehdasfunktiota kutsutaan jokaisen uuden ilmentymän kohdalla, joten jokainen ilmentymä saa oman uuden olionsa.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default ja default_factory

Käyttäkää field(default=...)-määritystä muuttumattomille arvoille, kun tarvitsette samalla muita field()-asetuksia. Käyttäkää default_factory-asetusta kaikille muuttuvalle arvoille. Molempia ei voi antaa yhtä aikaa.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Kentän jättäminen pois repr-esityksestä

repr=False-asetus piilottaa kentän automaattisesti luodusta __repr__-esityksestä. Tämä on hyödyllistä salaisuuksille tai suurille sisäisille puskureille.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Kentän jättäminen pois vertailusta

Kun käytätte asetusta compare=False, kenttä jätetään automaattisesti luodun __eq__-metodin (ja järjestysvertailun) ulkopuolelle. Kaksi ilmentymää voivat olla yhtäsuuret, vaikka kyseinen kenttä olisi erilainen.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

init=False-kentät

Asetus init=False jättää kentän __init__-metodin ulkopuolelle. Yleensä yhdistätte sen oletusarvoon tai asetatte arvon __post_init__-metodissa.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ johdettujen arvojen laskemiseen

Määrittäkää __post_init__, jos haluatte suorittaa koodia heti automaattisesti luodun __init__-metodin jälkeen. Se on luonteva paikka muista kentistä johdettujen kenttien laskemiseen.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Metatietojen tallentaminen

metadata-argumentti liittää kenttään mielivaltaisen kuvausjoukon. Python jättää sen huomiotta, mutta työkalut ja oma koodinne voivat lukea sitä dokumentointia tai validointia koskevia vihjeitä varten.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

field()-asetusten yhdistäminen

Asetuksia voi yhdistää. Yksi kenttä voidaan piilottaa repr-esityksestä, jättää vertailun ulkopuolelle ja varustaa oletusarvolla samanaikaisesti.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Pikatarkistus

Miten dataclass-kentälle annetaan oletusarvoksi tyhjä lista?

Kertaus

Opitte määrittämään oletusarvoja ja käyttämään field()-asetuksia.

  • Oletusarvolliset kentät tulevat pakollisten kenttien jälkeen.
  • Käyttäkää default_factory-asetusta muuttuville oletusarvoille.
  • repr-, compare-, init- ja metadata-asetuksilla säädetään kunkin kentän toimintaa.
  • __post_init__ laskee johdetut arvot.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Oletusarvot ja field()” ilmainen?

Kyllä – oppitunnin ”Oletusarvot ja field()” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Oletusarvot ja field()”?

Asettakaa oletusarvot ja käyttäkää field()-asetuksia. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Oletusarvot ja field()”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Dataclassin määrittäminen
  2. Oletusarvot ja field()
  3. Jäädytys- ja vertailuasetukset
  4. attrs-kirjasto
← Takaisin: Python Academy