En aquest tutorial, aprendrem sobre els tipus constants i com ajuden a millorar la llegibilitat del codi. Si no esteu familiaritzats, les constants són els noms que representen valors que no canvien durant l'execució del programa. Són el concepte fonamental més comú en la programació. Tanmateix, Python no té una sintaxi dedicada per definir constants. En general, les constants de Python són variables que mai canvien. Tindrem una discussió detallada sobre la constant de Python a la propera secció.
Què són les constants?
Generalment, a les matemàtiques s'utilitza un terme constant, un valor o quantitat que no canvia mai. En programació, una constant fa referència al nom associat a un valor que mai canvia durant l'execució de la programació. La constant de programació és diferent d'altres constants i consta de dues coses: un nom i un valor associat. El nom descriurà de què tracta la constant, i el valor és l'expressió concreta de la mateixa constant.
Un cop definida la constant, només podem accedir al seu valor però no podem canviar-lo amb el temps. Tanmateix, podem modificar el valor de la variable. Un exemple de la vida real és: la velocitat de la llum, el nombre de minuts en una hora i el nom de la carpeta arrel d'un projecte.
Per què utilitzar constant?
En els llenguatges de programació, les constants ens permeten protegir-nos del canvi accidental del seu valor que pot provocar errors difícils de depurar. També és útil fer que el codi sigui més llegible i fàcil de mantenir. Vegem alguns avantatges de constant.
Constants definides per l'usuari
Hem d'utilitzar la convenció de nomenclatura a Python per definir la constant a Python. Hem d'escriure el nom en majúscules amb un guió baix que separen les paraules.
A continuació es mostren l'exemple de les constants de Python definides per l'usuari:
recorregut de comandes per correu
PI = 3.14 MAX_SPEED = 300 DEFAULT_COLOR = ' 33[1;34m' WIDTH = 20 API_TOKEN = '567496396372' BASE_URL = 'https://api.example.com' DEFAULT_TIMEOUT = 5 BUILTINS_METHODS = ('sum', 'max', 'min', 'abs') INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', ... ]
Hem utilitzat de la mateixa manera que creem variables a Python. Per tant, podem suposar que les constants de Python són només variables, i l'única distinció és que la constant només utilitza lletres majúscules.
L'ús de lletres majúscules fa que la constant es destaqui de les nostres variables i és una pràctica útil o preferida.
Més amunt vam parlar dels usuaris definits per l'usuari; Python també proporciona diversos noms interns que es poden considerar i han de tractar com a constants.
Constants importants en Python
En aquesta secció, coneixerem algunes constants internes que s'utilitzen per fer que el codi Python sigui més llegible. Entenem algunes constants importants.
Constants incorporades
A la documentació oficial, el És cert i Fals apareixen com a primera constant. Aquests són valors booleans de Python i són la instància de l'int. A És cert té un valor d'1, i Fals té un valor 0.
Exemple -
>>> True True >>> False False >>> isinstance(True, int) True >>> isinstance(False, int) True >>> int(True) 1 >>> int(False) 0 >>> True = 42 ... SyntaxError: cannot assign to True >>> True is True True >>> False is False True
Recordeu que els noms Vertader i Fals són constants estrictes. És a dir, no podem reassignar-los, i si intentem reassignar-los, obtindrem un error de sintaxi. Aquests dos valors són objectes singleton a Python, el que significa que només existeix una instància.
Noms interns de Dunder
Python també té molts interns tro noms que podem considerar constants. Hi ha diversos d'aquests noms únics, aprendrem sobre __nom__ i __fitxer__ en aquesta secció.
L'atribut __name__ està relacionat amb com s'executa una part de codi determinada. Quan s'importa un mòdul, Python intern estableix el __nom__ en una cadena que conté el nom del mòdul.
new_file.py
print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}')
A la línia d'ordres i escriviu la següent comanda:
python -c 'import new_file'
El -c s'utilitza per executar un petit fragment de codi de Python a la línia d'ordres. A l'exemple anterior, hem importat el fitxer_nou mòdul, que mostra alguns missatges a la pantalla.
Sortida -
The type of __name__ is: The value of __name__ is: timezone
Com podem veure que el __name__ emmagatzema la cadena __main__, indica que podem executar els fitxers executables directament com a programa Python.
D'altra banda, l'atribut __file__ té el fitxer que Python està important o executant actualment. Si utilitzem l'atribut __file__ dins del fitxer, obtindrem el camí al mateix mòdul.
Vegem el següent exemple -
Exemple -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Sortida:
The type of __file__ is: The value of __file__ is: D:Python Project ew_file.py
També podem córrer directament i obtindrem el mateix resultat.
Exemple -
sinó si bash
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Sortida:
python new_file.py The type of __file__ is: The value of __file__ is: timezone.py
Constants de cadena i matemàtiques útils
Hi ha moltes constants valuoses a la biblioteca estàndard. Alguns estan estrictament connectats a mòduls, funcions i classes específics; molts són genèrics i els podem utilitzar en diversos escenaris. A l'exemple següent, utilitzarem els mòduls matemàtics i relacionats amb cadenes math i string, respectivament.
Entenem el següent exemple:
Exemple -
>>> import math >>> math.pi 3.141592653589793 >>> math.tau 6.283185307179586 >>> math.nan nan >>> math.inf inf >>> math.sin(30) -0.9880316240928618 >>> math.cos(60) -0.9524129804151563 >>> math.pi 3.141592653589793
Aquestes constants tindran un paper vital quan escrivim codi relacionat amb les matemàtiques o realitzem alguns càlculs específics.
Entenem l'exemple següent:
Exemple -
import math class Sphere: def __init__(self, radius): self.radius = radius def area(self): return math.pi * self.radius**2 def perimeter(self): return 2 * math.pi * self.radius def projected_volume(self): return 4/3 * math.pi * self.radius**3 def __repr__(self): return f'{self.__class__.__name__}(radius={self.radius})'
En el codi anterior, hem utilitzat el math.pi en lloc de costum Pi constants. La constant relacionada amb les matemàtiques proporciona més contextos al programa. L'avantatge d'utilitzar la constant math.pi és que si utilitzem una versió anterior de Python, obtindrem una versió de Pi de 32 bits. Si utilitzem el programa anterior a la versió moderna de Python, obtindrem una versió de pi de 64 bits. Així, el nostre programa s'autoadaptarà al seu entorn d'execució concret.
El mòdul de cadena també proporciona algunes constants de cadena integrades útils. A continuació es mostra la taula del nom i el valor de cada constant.
Nom | Valor |
---|---|
ascii_minúscula | Abcdefghijklmnopqrstuvwxyz |
ascii_majúscules | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
lletres_ascii | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
dígits | 0123456789 |
xifres hexadecimals | 0123456789abcdefABCDEF |
octdígits | 01234567 |
Podem utilitzar aquestes constants relacionades amb cadenes en expressions regulars, processant llenguatge natural, amb molt de processament de cadenes i molt més.
Constants d'anotació de tipus
Des de Python 3.8, el mòdul de mecanografia inclou una classe Final que ens permet anotar constants. Si fem servir la classe Final per definir les constants del programa, obtindrem l'error de tipus estàtic que comprova el verificador mypy i ens mostrarà que no podem reassignar el nom Final. Entenem l'exemple següent.
Exemple -
from typing import Final MAX_Marks: Final[int] = 300 MAX_Students: Final[int] = 500 MAX_Marks = 450 # Cannot assign to final name 'MAX_SPEED' mypy(error)
Hem especificat la variable constant amb la classe final que indicava l'error de tipus per informar d'un error si es reassigna un nom declarat. No obstant això, rep un informe d'error d'un verificador de tipus; Python canvia el valor de MAX_SPEED. Per tant, Final no impedeix la reassignació accidental constant en temps d'execució.
Constants de cadena
Com s'ha comentat a la secció anterior, Python no admet constants estrictes; només té variables que mai canvien. Per tant, la comunitat Python segueix la convenció de denominació d'utilitzar la lletra majúscula per identificar les variables constants.
Pot ser un problema si treballem en un gran projecte Python amb molts programadors a diferents nivells. Per tant, seria una bona pràctica disposar d'un mecanisme que ens permeti utilitzar constants estrictes. Com sabem, Python és un llenguatge dinàmic i hi ha diverses maneres de fer que les constants siguin immutables. En aquesta secció, coneixerem algunes d'aquestes maneres.
Els atributs .__slots__
Les classes de Python ofereixen la possibilitat d'utilitzar els atributs __slots__. La ranura té el mecanisme especial per reduir la mida dels objectes. És un concepte d'optimització de memòria en objectes. Si fem servir l'atribut __slots__ a la classe, no podrem afegir la nova instància, perquè no utilitza atributs __dict__. A més, no tenir un .__dict__ L'atribut implica una optimització en termes de consum de memòria. Entenem l'exemple següent.
Exemple: sense utilitzar els atributs __slots__
class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__)
Sortida -
desar el vídeo de youtube vlc
{'a': 1, 'b': 2}
Cada objecte de Python conté un diccionari dinàmic que permet afegir atributs. Els diccionaris consumeixen molta memòria i l'ús de __slots__ redueix el malbaratament d'espai i memòria. Vegem un altre exemple.
Exemple -
class ConstantsName: __slots__ = () PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Sortida -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only
Al codi anterior, hem inicialitzat els atributs de classe amb els atributs de les ranures. La variable té un valor constant, si intentem reassignar la variable, obtindrem un error.
El @decorador de la propietat
També podem utilitzar @propietat decorador per crear una classe que funcioni com a espai de noms per a constants. Només hem de definir la propietat constants sense proporcionar-los un mètode setter. Entenem l'exemple següent.
Exemple -
class ConstantsName: @property def PI(self): return 3.141592653589793 @property def EULER_NUMBER(self): return 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Sortida -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute
Només són propietats de només lectura, si intentem reassignar, obtindrem un Error d'atribut.
La funció de fàbrica namedtuple().
El mòdul de col·lecció de Python inclou la funció de fàbrica anomenada namedtuple(). Utilitzant el namedtuple() funció, podem utilitzar els camps amb nom i la notació de punts per accedir als seus elements. Sabem que les tuples són immutables, la qual cosa significa que no podem modificar un objecte de tuple amb nom existent al seu lloc.
Entenem l'exemple següent.
Exemple -
from collections import namedtuple ConstantsName = namedtuple( 'ConstantsName', ['PI', 'EULER_NUMBER'] ) constant = ConstantsName(3.141592653589793, 2.718281828459045) print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Sortida -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute
El decorador de @dataclass
Com el seu nom indica, la classe de dades conté dades, poden consistir en mètodes, però no és el seu objectiu principal. Hem d'utilitzar el decorador @dataclass per crear les classes de dades. També podem crear les constants estrictes. El decorador @dataclass pren un argument congelat que ens permet marcar la nostra classe de dades com a immutable. Els avantatges d'utilitzar @dataclass decorator, no podem modificar el seu atribut d'instància.
Entenem l'exemple següent.
Exemple -
from dataclasses import dataclass @dataclass(frozen=True) class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Sortida -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 19, in File '', line 4, in __setattr__ dataclasses.FrozenInstanceError: cannot assign to field 'PI'
Explicació -
quantes setmanes hi ha en un mes
Al codi anterior, hem importat el decorador @dataclass. Hem utilitzat aquest decorador per a ConstantsName per convertir-lo en una classe de dades. Hem establert l'argument congelat a True per fer que la classe de dades sigui immutable. Hem creat la instància de la classe de dades i podem accedir a totes les constants però no podem modificar-les.
El mètode especial .__setattr__().
Python ens permet utilitzar un mètode especial anomenat .__setattr__(). Mitjançant aquest mètode, podem personalitzar el procés d'assignació d'atributs perquè Python crida automàticament el mètode en cada assignació d'atributs. Entenem el següent exemple:
Exemple -
class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 def __setattr__(self, name, value): raise AttributeError(f'can't reassign constant '{name}'') constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Sortida -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI'
El mètode __setattr__() no permet realitzar cap operació d'assignació sobre els atributs de la classe. Si intentem reassignar, només genera un Error d'atribut.
Conclusió
Les constants s'utilitzen més en concepte en programació, especialment en termes matemàtics. En aquest tutorial, hem après els conceptes importants de les constants i els seus sabors. La comunitat Python utilitza la lletra majúscula com a convenció de nom per identificar les constants. Tanmateix, hem comentat algunes maneres avançades d'utilitzar les constants a Python. Hem parlat de com millorar la llegibilitat, la reutilització i el manteniment del codi amb constants. Hem esmentat com aplicar diverses tècniques per fer que les nostres constants de Python siguin estrictament constants.