7. Bibliotecas y Módulos¶
7.1 Biblioteca básica¶
Hay algunas funciones y clases que se pueden usar directamente en la biblioteca estándar. Proporcionan servicios básicos para los programas de Berry, por lo que también se denominan bibliotecas básicas. Las funciones y clases de la biblioteca básica están visibles en el ámbito global (perteneciente al ámbito integrado), por lo que se pueden utilizar en cualquier lugar. No defina variables con el mismo nombre que las funciones o clases en la biblioteca base. Si lo hace, será imposible hacer referencia a las funciones y clases en la biblioteca base.
7.1.1 Función integrada¶
Función print
¶
Ejemplo
print(...)
Descripción
Esta función imprime los parámetros de entrada en el dispositivo de
salida estándar. La función puede aceptar cualquier tipo y cualquier
número de parámetros. Todos los tipos imprimirán su valor directamente,
y para una instancia, esta función verificará si la instancia tiene un
método tostring()
, y si lo hay, imprimirá el valor de retorno de la
instancia llamando al método tostring()
, de lo contrario, imprimirá
la dirección de la instancia.
print('Hola mundo!') # Hola mundo!
print([1, 2, '3']) # [1, 2, '3']
print(print) # <function: 0x561092293780>
Función input
¶
Ejemplo
input()
input(prompt)
Descripción
La función input
se usa para ingresar una línea de cadena de
caracteres desde el dispositivo de entrada estándar. Esta función puede
usar el parámetro prompt
como un indicador de entrada, y el
parámetro prompt
debe ser de tipo cadena. Después de llamar a la
función input
, los caracteres se leerán desde el búfer del teclado
hasta que se encuentre un carácter de nueva línea.
input('por favor ingrese una cadena:') # por favor ingrese una cadena:
La función input
no regresa hasta que se presiona la tecla “Enter”,
por lo que el programa queda “atascado” y no es un error.
Función type
¶
Ejemplo
type(valor)
valor: parámetro de entrada (se espera obtener su tipo).
valor devuelto: una cadena que describe el tipo de parámetro.
Descripción
Esta función recibe un parámetro de cualquier tipo y devuelve el tipo del parámetro. El valor devuelto es una cadena que describe el tipo del parámetro. La siguiente tabla muestra los valores de retorno correspondientes a los principales tipos de parámetros:
Tipo de parámetro |
Valor devuelto |
Tipo de parámetro |
Valor devuelto |
---|---|---|---|
Nil |
|
Integer |
|
Real |
|
Boolean |
|
Function |
|
Class |
|
String |
|
Instance |
|
puntero nativo |
|
type(0) # 'int'
type(0.5) # 'real'
type('hello') # 'string'
type(print) # 'función'
Función classname
¶
Ejemplo
classname(objeto)
Descripción
Esta función devuelve el nombre de clase (cadena) del parámetro. Por lo
tanto, el parámetro debe ser una clase o instancia, y otros tipos de
parámetros devolverán nil
.
classname(list) # 'list'
classname(list()) # 'list'
classname({}) # 'map'
classname(0) # nil
Función classof
¶
Ejemplo
classof(objeto)
Descripción
Devuelve la clase de un objeto de instancia. El parámetro objeto
debe ser una instancia. Si la función se llama con éxito, devolverá la
clase a la que pertenece la instancia; de lo contrario, devolverá
nil
.
classof(list) # nil
classof(list()) # <class: list>
classof({}) # <class: map>
classof(0) # nil
Función str
¶
Ejemplo
str(valor)
Descripción
Esta función convierte los parámetros en cadenas y los devuelve. Las
funciones str
pueden aceptar cualquier tipo de parámetros y
convertirlos. Cuando el tipo de parámetro es una instancia, verificará
si la instancia tiene un método tostring()
, si lo hay, se usará el
valor de retorno del método; de lo contrario, la dirección de la
instancia se convertirá en una cadena.
str(0) # '0'
str(nil) # 'nil'
str(list) # 'list'
str([0, 1, 2]) # '[0, 1, 2]'
Función number
¶
number(valor)
Descripción
Esta función convierte la cadena o el número de entrada en un tipo
numérico y lo devuelve. Si el parámetro de entrada es un número entero o
real, devuelve directamente. Si es una cadena de caracteres, intenta
convertir la cadena de caracteres en un valor numérico en formato
decimal. El número entero o real se juzgará automáticamente durante la
conversión. Otros tipos devuelven nil
.
Ejemplo
number(5) # 5
number('45.6') # 45.6
number('50') # 50
number(list) # nil
Función int
¶
int(valor)
Descripción
Esta función convierte la cadena o el número de entrada en un número
entero y lo devuelve. Si el parámetro de entrada es un número entero,
regresa directamente, si es un número real, descarta la parte decimal.
Si es una cadena, intenta convertir la cadena en un número entero en
decimal. Otros tipos devuelven nil
. Cuando el tipo de parámetro es
una instancia, verificará si la instancia tiene un método toint()
,
si lo hay, se utilizará el valor de retorno del método.
Ejemplo
int(5) # 5
int(45.6) # 45
int('50') # 50
int('0x10) # 16 - literal hexadecimal es válido
int(list) # nil
Función real
¶
real(valor)
Descripción
Esta función convierte la cadena o el número de entrada en un número
real y lo devuelve. Si el parámetro de entrada es un número real,
devolverá directamente, si es un número entero, se convertirá en un
número real. Si es una cadena, intenta convertir la cadena en un número
real en decimal. Otros tipos devuelven nil
.
Ejemplo
real(5) # 5, type(real(5)) →'real'
real(45.6) # 45.6
real('50.5') # 50.5
real(list) # nil
Función bool
¶
bool(valor)
Descripción
Esta función convierte la cadena o el número de entrada en un valor booleano y lo devuelve.
La conversión sigue las siguientes reglas:
nil
: convertido afalso
.Entero: cuando el valor es
0
, se convierte enfalso
, de lo contrario, se convierte enverdadero
.Número real: cuando el valor es
0.0
, se convierte enfalso
, de lo contrario, se convierte enverdadero
.Cadena: cuando el valor es “” (cadena vacía) se convierte en
falso
de lo contrario, se convierte enverdadero
.Comobj y Comptr: cuando el puntero interno es
NULL
es convertido afalso
, de lo contrario se convierte averdadero
.Instancia: si la instancia contiene un método
tobool()
, se utilizará el valor de retorno del método, de lo contrario, se convertirá enverdadero
.Todos los demás tipos: convierte a
verdadero
.
Ejemplo
bool() # false
bool(nil) # false
bool(false) # false
bool(true) # true
bool(0) # false
bool(1) # true
bool("") # false
bool("a") # true
bool(3.5) # true
bool(list) # true
bool([]) # true
bool({}) # true
# avanzado
import introspect
bool(introspect.toptr(0)) # false
bool(introspect.toptr(0x1000)) # true
Función size
¶
size(valor)
Descripción
Esta función devuelve el tamaño de la cadena de entrada. Si el parámetro
de entrada no es una cadena, se devuelve 0. La longitud de la cadena se
calcula en bytes. Esta función también funciona para instancias de
list
y map
y devuelve el número de elementos.
Ejemplo
size(10) # 0
size('s') # 1
size('string') # 6
size([1,2]) # 2
size({"a":1}) # 1
Función super
¶
super(objeto)
Descripción
Esta función devuelve el objeto principal de la instancia. Cuando crea
una instancia de una clase derivada, también creará una instancia de su
clase base. Se requiere la función super
para acceder a la instancia
de la clase base (es decir, el objeto principal).
Consulte el capítulo 6 sobre el comportamiento mágico de
super(objeto)
al llamar a un supermétodo.
Ejemplo
class mi_lista: lista end
l = mi_lista() # classname(l) -->'mi_lista'
sl = super(l) # classname(sl) -->'lista'
Función assert
¶
assert(expresión)
assert(expresión, mensaje)
Descripción
Esta función se utiliza para implementar la función de aserción. La
función assert
acepta un parámetro. Cuando el valor del parámetro es
false
o nil
, la función activará un error de aserción; de lo
contrario, la función no tendrá ningún efecto. Cabe señalar que incluso
si el parámetro es un valor equivalente a false
en operaciones
lógicas (por ejemplo, 0
), no generará un error de aserción. El
parámetro mensaje
es opcional y debe ser una cadena. Si se utiliza
este parámetro, la información de texto proporcionada en message
se
mostrará cuando se produzca un error de aserción; de lo contrario, se
mostrará el mensaje predeterminado “Assert Fail
”.
Ejemplo
assert(false) # aserción fallida!
assert(nil) # aserción fallida!
assert() # aserción fallida!
assert(0) # aserción fallida!
assert(false,'mensaje de aserción del usuario.') # mensaje de aserción.
assert(true) # pasa
Función compile
¶
compile(cadena)
compile(cadena, 'string')
compile(nombre_archivo, 'file')
Descripción
Esta función compila el código fuente de Berry en una función. El código
fuente puede ser una cadena o un archivo de texto. El primer parámetro
de la función compile
es una cadena, y el segundo parámetro es una
'cadena'
o 'archivo'
. Cuando el segundo parámetro es
'cadena'
o no hay un segundo parámetro, la función compile
compilará el primer parámetro como código fuente. Cuando el segundo
parámetro es 'file'
, la función compile
compilará el archivo
correspondiente al primer parámetro. Si la compilación es exitosa,
compile
devolverá la función compilada; de lo contrario, devolverá
nil
.
Ejemplo
compile('print(\'Hola mundo!\')')() # Hola mundo!
compile('test.be','file')
Clase list
¶
list
es un tipo incorporado, y define un contenedor de
almacenamiento secuencial que admite la lectura y escritura de
subíndices. Es similar a las matrices en otros lenguajes de
programación. La obtención de una instancia de la clase list
se
puede construir usando un par de corchetes: []
generará una
instancia vacía de list
, y [expr, expr, ...]
generará una
list
ejemplo con varios elementos. También se puede instanciar
llamando a la clase list
: ejecutar list()
obtendrá una instancia
vacía de list
, y list(expr, expr, ...)
devolverá una instancia
con varios elementos.
Método list
(Constructor)¶
Inicializa el contenedor list
. Este método puede aceptar de 0 a
múltiples parámetros. La instancia list
generada cuando se pasan
múltiples parámetros tendrá estos parámetros como elementos, y el orden
de disposición de los elementos es coherente con el orden de disposición
de los parámetros.
Método tostring
¶
Serializa la instancia de list
en una cadena y la devuelve. Por
ejemplo, el resultado de ejecutar [1, [], 1.5].tostring()
es
'[1, [], 1.5]''. Si el contenedor
list` se refiere a sí mismo, la
posición correspondiente utilizará puntos suspensivos en lugar del valor
específico:
l = [1, 2]
l[0] = l
print(l) # [[...], 2]
Método concat
¶
Convierte cada elemento de la lista en cadenas y la concatena usando la cadena proporcionada.
l = [1, 2, 3]
l.concat() # '123'
l.concat(", ") # '1, 2, 3'
Método push
¶
Agrega un elemento al final del contenedor list
. El prototipo de
este método es push(valor)
, el parámetro valor
es el valor que
se agregará, y el valor agregado se almacena al final del contenedor
list
. La operación de agregar aumenta el número de elementos en el
contenedor list
en 1. Puede agregar cualquier tipo de valor a la
instancia de lista
.
Método insert
¶
Inserta un elemento en la posición especificada del contenedor list
.
El prototipo de este método es insert(indice, valor)
, el parámetro
indice
es la posición a insertar, y valor
es el valor a
insertar. Después de insertar un elemento en la posición indice
,
todos los elementos que originalmente comenzaron desde esta posición se
moverán hacia atrás un elemento. La operación de inserción aumenta el
número de elementos en el contenedor list
en 1. Puede insertar
cualquier tipo de valor en el contenedor list
.
Supongamos que el valor de una instancia de lista
l
es
[0, 1, 2]
, e insertamos una cadena 'cadena'
en la posición 1, y
necesitamos llamar a l.insert(1, 'cadena')
. Finalmente, el nuevo
valor de lista
es [0, 'cadena', 1, 2]
.
Si el número de elementos en un contenedor list
es S, el rango de
valores de la posición de inserción es {i ∈ ℤ : − S ≤ i < S}.
Cuando la posición de inserción es positiva, indexa hacia atrás desde el
principio del contenedor list
; de lo contrario, indexa hacia
adelante desde el final del contenedor list
.
Método remove
¶
Quita un elemento del contenedor. El prototipo de este método es
remove(indice)
, y el parámetro indice
es la posición del
elemento a eliminar. Después de eliminar el elemento, el elemento detrás
del elemento eliminado avanzará un elemento y la cantidad de elementos
en el contenedor se reducirá en 1. Al igual que el método insert
, el
método remove
también puede usar índices positivos o negativos.
Método item
¶
Obtiene un elemento en el contenedor list
. El prototipo de este
método es item(indice)
, el parámetro indice
es el índice del
elemento a obtener, y el valor de retorno del método es el elemento en
la posición del índice. list
El contenedor admite múltiples métodos
de indexación:
Índice entero: El valor del índice puede ser un número entero positivo o un entero negativo. Si el índice es negativo, es relativo al final de la lista; es decir,
-1
indica el último elemento de la lista. El valor de retorno deitem
es el elemento en la posición del índice. Si la posición del índice excede el número de elementos en el contenedor o está antes del elemento 0, el métodoitem
devuelvenil
.Índice
list
: Utilizando una lista de enteros como índice,item
devuelve unalista
, y cada elemento en el valor devueltolista
es un elemento correspondiente a cada índice entero en el parámetrolista
. los el valor de la expresión[3, 2, 1].item([0, 2])
es[3, 1]
. Si una tipo de elemento en el parámetrolista
no es un número entero, entonces el el valor en esa posición en el valor de retornolista
esnil
.Índice
range
: Usando un rango de enteros como índice,item
devuelve unalista
. El valor devuelto almacena los elementos indexados de lalista
desde el límite inferior hasta el límite superior del parámetrorange
. Si el índice excede el rango de índice de la ‘lista’ indexada, el retorno valuelist
usaránil
para llenar la posición más allá del índice.
Método setitem
¶
Establece el valor de la posición especificada en el contenedor. El
prototipo de este método es setitem(indice, valor)
, indice
es la
posición del elemento a escribir y valor
es el valor a escribir.
indice
es el valor de índice entero de la posición de escritura. Las
posiciones de índice fuera del rango de índice del contenedor harán que
setitem
no se ejecute.
Método size
¶
Devuelve el número de elementos en el contenedor, que es la longitud del
contenedor. El prototipo de este método es size()
.
Método resize
¶
Restablece la lista
a la longitud del contenedor. El prototipo de
este método es resize(count)
, y el parámetro count
es la nueva
longitud del contenedor. Al usar resize
para aumentar la longitud
del contenedor, el nuevo elemento se inicializará en nil
. El uso de
resize
para reducir la longitud del contenedor descartará algunos
elementos al final del contenedor. P.ej:
l = [1, 2, 3]
l.resize(5) # Expansion, l == [1, 2, 3, nil, nil]
l.resize(2) # Reduce, l == [1, 2]
Método iter
¶
Devuelve un iterador para recorrer el contenedor list
actual.
Método find
¶
Similar a item
o list[idx]
. La única diferencia es que si el
índice está fuera de rango, find
devuelve nil
en su lugar o
genera una excepción.
Método reverse
¶
Cambia la lista en el lugar e invierte el orden de los elementos. También devuelve la lista resultante.
Clase map
¶
La clase map
es un tipo de clase incorporado que se utiliza para
proporcionar un contenedor desordenado de pares clave-valor. Dentro del
intérprete de Berry, map
usa la tabla Hash para su implementación.
Puede utilizar pares de llaves para construir un contenedor map
. El
uso de un par de llaves vacías {}
generará una instancia de map
vacía. Si necesita construir una instancia de map
que no esté vacía,
use dos puntos para separar la clave y el valor, y use un punto y coma
para separar varios pares clave-valor. Por ejemplo, {0: 1, 2: 3}
tiene dos pares clave-valor (0,1) y (2,3). También puede obtener una
instancia de map
vacía llamando a la clase map
.
Método map
(Constructor)¶
Inicializa el contenedor map
, este método no acepta parámetros.
Ejecutar map()
obtendrá una instancia de map
vacía.
Método tostring
¶
Serializa map
como una cadena y regresa. La cadena serializada es
similar a la escritura literal. Por ejemplo, el resultado de ejecutar
'str': 1, 0: 2
es "'str': 1, 0: 2"
. Si el contenedor map
se
refiere a sí mismo, la posición correspondiente utilizará puntos
suspensivos en lugar del valor específico:
m = {'map': nil,'texto':'hola'}
m['map'] = m
print(m) # {'texto':'hola','map': {...}}
Método insert
¶
Inserta un par clave-valor en el contenedor map
. El prototipo de
este método es insert(llave, valor)
, el parámetro llave
es la
clave a insertar, y valor
es el valor a insertar. Si el map
clave que se va a insertar existe en el contenedor, se actualizará el
par clave-valor original.
Método remove
¶
Elimina un par clave-valor del contenedor map
. El prototipo de este
método es remove(llave)
, y el parámetro llave
es la clave del
par clave-valor que se eliminará.
Método item
¶
Obtiene un valor en el contenedor map
. El prototipo de este método
es item(llave)
, el parámetro llave
es la clave del valor a
obtener, y el valor de retorno del método es el valor correspondiente a
la clave.
Método setitem
¶
Establece el valor correspondiente a la clave especificada en el
contenedor. El prototipo de este método es setitem(clave, valor)
,
clave
es la clave del par clave-valor a escribir, y valor
es el
valor a escribir. Si no hay un par clave-valor con la clave clave
en
el contenedor, el método setitem
fallará.
Método size
¶
Devuelve el número de pares clave-valor del contenedor map
, que es
la longitud del contenedor. El prototipo de este método es size()
.
Método contains
¶
Devuelve true
booleano si se encuentra un par clave-valor
coincidente en el contenedor map
; de lo contrario, false
. El
prototipo de este método es contains(llave)
.
Método find
¶
Devuelve el valor correspondiente a la clave especificada en el
contenedor. El prototipo de este método es find(llave)
o
find(llave, valor_defecto)
, llave
es la clave del par
clave-valor al que se accederá, y valor_defecto
es el valor
predeterminado devuelto si la clave no se encuentra. Si no se especifica
ningún valor predeterminado, se devuelve nil
en su lugar.
Clase range
¶
La clase se usa para representar un intervalo cerrado entero. Utilice el
operador binario ..
para construir una instancia de range
. Los
operandos izquierdo y derecho del operador deben ser números enteros.
Por ejemplo, 0..10
significa el intervalo entero [0,10] ∩ ℤ.
Si no especifica el rango alto, se establece en MAXINT
. Ejemplo:
imprimir(0..) # (0..9223372036854775807)
Por lo general, hay dos formas de recorrer una lista:
l = [1,2,3,4]
for e:l print(e) end # 1/2/3/4
for i:0..size(l)-1 print(l[i]) end # 1/2/3/4
Clase bytes
¶
Los objetos bytes
se representan como matrices de bytes
hexadecimales. El constructor bytes
toma una cadena de Hex y
construye el búfer en memoria.
Ejemplo:
b = bytes()
print(b) # bytes('')
b = bytes("1155AA") # secuencia de bytes 0x11 0x55 0xAA
size(b) # 3 = 3 bytes
b[0] # 17 (0x11)
b[0] = 16 # asigna el primer byte
print(b) # bytes('1055AA')
Método bytes
(Constructor)¶
Inicializar una matriz de bytes. Hay varias opciones.
Opción 1: valor vacío
bytes()
crea una nueva matriz de bytes vacía.
tamaño(bytes()) == 0
.
No hay límite en el tamaño de una matriz de bytes, excepto la memoria disponible. Se asigna un búfer interno y se reasigna en caso de que el anterior fuera demasiado pequeño. El búfer inicial es de 36 bytes, pero puede preasignar un búfer más grande (o más pequeño) si sabe de antemano el tamaño necesario.
De manera similar, el búfer se reduce automáticamente si se usa menos del tamaño necesario.
b = bytes(4096) # 4096 bytes preasignados
Opción 2: valor inicial
Si el primer argumento es una “cadena”, se analiza como una lista de valores hexadecimales. Puede agregar un segundo argumento opcional para preasignar un búfer más grande.
b = bytes("BEEF0000")
print(b) # bytes('beef0000')
b = bytes("112233", 128) # preasignar 128 bytes internamente
print(b) # bytes('112233')
Opción 3: tamaño fijo
Si el tamaño proporcionado es negativo, el tamaño de la matriz es fijo y no se puede reducir ni aumentar.
b = bytes(-8)
print(b) # bytes('0000000000000000')
b = bytes("AA", -4)
print(b) # bytes('AA000000')
b = bytes("1122334455", -4)
atributo_error: tamaño del objeto en bytes es fijo y no se puede cambiar el tamaño
Opción 4: asignación de memoria
Precaución, use con mucho cuidado
En este modo, la matriz de bytes se asigna a una región específica de la
memoria. Debe proporcionar la dirección base como comptr
y el
tamaño. El tamaño siempre se fija, ya sea positivo o negativo. Esta
función es peligrosa ya que puede acceder a cualquier ubicación de
la memoria, lo que provoca un bloqueo si la ubicación está protegida o
no es válida. Usar con cuidado.
En este caso, b.ismapped()
devuelve true
indicando un búfer de
memoria mapeado. En todos los demás casos, b.ismapped()
devuelve
falso
. Esto se usa típicamente para saber si Berry asignó el búfer o
no, y si los subelementos deben desasignarse explícitamente.
Ejemplo:
import introspect
def f() return 0 end
addr = introspect.toptr(f)
print(addr) # <ptr: 0x3ffeaf88>
b = bytes(addr, 8)
print(b) # bytes('F8EAFE3F24000000')
# este ejemplo muestra los primeros 8 bytes del objeto de función en la memoria
Método size
¶
Devuelve el número de bytes en la matriz de bytes
b = bytes("1122334455")
b.size() # 5
size(b) # 5
Método tostring
¶
Muestra una forma legible por humanos la matriz de bytes en hexadecimal.
Por defecto, muestra solo los primeros 32 caracteres. Puede solicitar
más caracteres agregando un argumento int con la cantidad máxima de
bytes que desea convertir. tostring
se usa internamente cuando se
imprime un objeto. print(b)
es equivalente a
print(b.tostring())
. Es diferente de asstring
, que convierte una
matriz de bytes en el objeto de cadena de bajo nivel equivalente sin
ninguna codificación.
b = bytes("1122334455")
b.tostring() # 'bytes(\'1122334455\')'
b = bytes()
b.resize(64) # redimenciona a 64 bytes
b.tostring() # 'bytes(\'0000000000000000000000000000000000000000000000000000000000000000...\')'
b.tostring(500) # 'bytes(\'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\')'
Método tohex
¶
Convierte la matriz de bytes en una cadena hexadecimal, similar a la
devuelta por tostring()
pero sin decoradores.
b = bytes("1122334455")
b.tohex() # '1122334455'
Método fromhex
¶
Actualiza el contenido de la matriz de bytes a partir de una nueva cadena hexadecimal. Esto permite cargar una nueva cadena hexadecimal sin asignar un nuevo objeto de bytes.
b = bytes("1122334455")
b.fromhex("AABBCC") # bytes('AABBCC')
Método clear
¶
Vuelve a poner la matriz de bytes en vacío
b = bytes("1122")
b.clear()
print(b) # bytes()
Método resize
¶
Reduce o expande la matriz de bytes para que coincida con el tamaño especificado. Si se expande, se agregan bytes NULL (0x00) al final del búfer.
b = bytes("11223344")
b.resize(6)
print(b) # bytes('112233440000')
b.resize(2)
print(b) # bytes('1122')
Métodos de concatenación +
y ..
¶
Puede usar +
para concatenar dos listas de bytes
, creando un
nuevo objeto bytes
. ..
cambia la lista en su lugar y se puede
usar para agregar un objeto int
(1 byte) o bytes
b = bytes("1122")
c = bytes("3344")
d = b + c # b y c no cambian
print(d) # bytes('11223344')
print(b) # bytes('1122')
print(c) # bytes('3344')
e = b..c # ahora b ha cambiado
print(e) # bytes('11223344')
print(b) # bytes('11223344')
print(c) # bytes('3344')
Método de acceso a bytes []
¶
Puede acceder a bytes individuales como enteros, para leer y escribir. Los valores que no están en el rango de 0 a 255 se cortan silenciosamente.
b = bytes("010203")
print(b[0]) # 1
# índices negativos cuentan desde el final
print(b[-1]) # 3
# fuera de los límites genera una excepción
print(b[5]) # index_error: índice de bytes fuera de rango
b[0] = -1
print(b) # bytes('FF0203')
b[1] = 256
print(b) # bytes('FF0003')
Método de acceso de rango []
¶
Puede usar el descriptor de acceso []
con un rango para obtener una
sublista de bytes
. Si un índice es negativo, se toma del final de la
matriz.
Esta construcción no se puede usar como un lvalue, es decir, no se
puede empalmar como b[1..2] = bytes("0011") # no permitido
.
b = bytes("001122334455")
print(b[1..2]) # bytes('1122')
# elimina los primeros 2 bytes
print(b[2..-1]) # bytes('22334455')
# eliminar los últimos 2 bytes
print(b[0..-3]) # bytes('00112233')
# se permite el sobreimpulso
print(b[4..10]) # bytes('4455')
# índices invertidos devuelven una matriz vacía
print(b[5..4]) # bytes('')
Los métodos estándar item
y setitem
se implementan y se asignan
de forma transparente al operador []
.
Método copy
¶
Crea una nueva copia nueva del objeto bytes
. Se asigna un nuevo
búfer de memoria y se duplican los datos.
b = bytes("1122")
print(b) # bytes('1122')
c = b.copy()
print(c) # bytes('1122')
b.clear()
print(b) # bytes('')
print(c) # bytes('1122')bytes('1122')
Métodos get, geti
¶
Lea un valor de 1/2/4 bytes de cualquier desplazamiento en la matriz de
bytes. El modo estándar es little endian, si se especifica un tamaño
negativo habilita big endian. get
devuelve valores sin signo,
mientras que geti
devuelve valores con signo.
b.get(<offset>, <size>) -> objeto de bytes
Si el desplazamiento está fuera de rango, se devuelve 0
(no se
genera ninguna excepción).
Ejemplo:
b = bytes("010203040506")
print(b.get(2,2)) # 1027 - 0x0403 read 2 bytes little endian
print(b.get(2,-2)) # 772 - 0x0304 read 2 bytes big endian
print(b.get(2,4)) # 100992003 - 0x06050403 - little endian
print(b.get(2,-4)) # 50595078 - 0x03040506 - big endian
b = bytes("FEFF")
print(b.get(0, 2)) # 65534 - 0xFFFE
print(b.geti(0, 2)) # -2 - 0xFFFE
Métodos set, seti
¶
Similar a get
y geti
, permite establecer un valor de 1/2/4 bytes
en cualquier desplazamiento. seti
usa números enteros con signo,
set
no tiene signo (en realidad, no hace la diferencia).
Si el desplazamiento está fuera de rango, no se realiza ningún cambio (no se genera ninguna excepción).
bytes.set(<offset>, <valor>, <tamaño>)
Método add
¶
Este método agrega valor de 1/2/4 bytes (little endian o big endian) al final del búfer. Si el tamaño es negativo, el valor se trata como big endian.
b.add(<valor>, <tamaño>)
Ejemplo:
b = bytes("0011")
b.add(0x22, 1)
print(b) # bytes('001122')
b.add(0x2233, 2)
print(b) # bytes('0011223322')
b.add(0x22334455, 4)
print(b) # bytes('001122332255443322')
b.add(0x00)
print(b) # bytes('00112233225544332200')
b.clear()
b.add(0x0102, -2)
print(b) # bytes('0102')
b.add(0x01020304, -4)
print(b) # bytes('010201020304')
Método asstring
¶
Convierte un búfer de bytes en una cadena. El búfer se convierte tal cual sin ninguna consideración de codificación. Si el búfer contiene caracteres NULL, la cadena se truncará.
b=bytes("3344")
print(b.asstring()) # '3D'
Método fromstring
¶
Convierte un búfer de bytes en una cadena. El búfer se convierte tal cual sin ninguna consideración de codificación. Si el búfer contiene caracteres NULL, la cadena se truncará.
b=bytes().fromstring("Hola")
print(b) # bytes('48656C6C6F')
Métodos de manipulación de bits setbits, getbits
¶
Puede leer y escribir a nivel de subbytes, especificando de qué bit a qué bit. El desplazamiento está en bits, no en bytes. Agregue el número de bytes * 8.
b.setbits(<offset_bits>, <len_bits>, <value>)
b.getbits(<offset_bits>, <len_bits>)
Codificación en base64, método tob64
¶
Convierte una matriz de bytes en una cadena base64.
b = bytes('deadbeef0011')
s = b.tob64()
print(s) # 3q2+7wAR
Decodificación en base64, método fromb64
¶
Convierte una cadena base64 en una matriz de bytes.
s = '3q2+7wAR'
b = bytes().fromb64(s)
print(b) # bytes('DEADBEEF0011')
Métodos getfloat
y setfloat
¶
Similar a get/set
, permite leer o escribir un valor en coma flotante
de 32 bits.
b.getfloat(<offset>)
b.getfloat(<offset>, <number>)
b = bytes("00000000")
b.getfloat(0) # 0
b.setfloat(0, -1.5)
print(b) # bytes('0000C0BF')
b.getfloat(0) # -1.5
Método _buffer
¶
Característica avanzada: devuelve la dirección del búfer en la memoria, para usar con código C.
b = bytes('1122')
b._buffer() # <ptr: 0x600000c283c0>
Método _change_buffer
¶
Característica avanzada: funciona solo para búferes mapeados (es
decir, b.ismapped() == true
), permite reasignar el búfer a una nueva
dirección de memoria. Esto permite reutilizar el objeto bytes() sin
reasignar una nueva instancia.
# este ejemplo usa la asignación de punteros, use con mucho cuidado
b1 = bytes("11223344")
b2 = bytes("AABBCCDD")
b1._buffer() # <ptr: 0x600000c2c390>
b2._buffer() # <ptr: 0x600000c24270>
# ahora creamos c como un búfer asignado de 4 bytes a la dirección de b1
c = bytes(b1._buffer(), 4)
print(c) # bytes('11223344') -- asignado a b1
c._buffer() # <ptr: 0x600000c2c390>
# cambiemos un byte para probarlo
c[0] = 254
print(c) # bytes('FE223344')
print(b1) # bytes('FE223344') -- b1 ha cambiado
# reasignar c al mapa b2
c._change_buffer(b2._buffer())
print(c) # bytes('AABBCCDD')
c._buffer() # <ptr: 0x600000c24270>
Módulos de expansión¶
Módulo JSON¶
JSON es un formato ligero de intercambio de datos. Es un subconjunto de JavaScript. Utiliza un formato de texto que es completamente independiente del lenguaje de programación para representar datos. Berry proporciona un módulo JSON para proporcionar soporte para datos JSON. El módulo JSON solo contiene dos funciones, “cargar” y “volcar”, que se utilizan para analizar cadenas JSON y multiplicar objetos Berry y serializar un objeto Berry en texto JSON.
Función load
¶
load(text)
Descripción
Esta función se usa para convertir el texto JSON de entrada en un objeto
Berry y devolverlo. Las reglas de conversión se muestran en la Tabla 1.1
. Si hay un error de sintaxis en el texto JSON, la función devolverá
nil
.
Tipo JSON |
Tipo Berry |
---|---|
|
|
|
|
|
|
|
|
|
|
Tabla 9: Reglas de conversión de tipo JSON a tipo Berry
Ejemplo
import json
json.load('0') # 0
json.load('[{"nombre": "liu", "edad": 13}, 10.0]') # [{'nombre':'liu','edad': 13}, 10]
Función dump
¶
dump(objectp, ['formato'])
Descripción
Esta función se usa para serializar el objeto Berry en texto JSON. Las reglas de conversión para la serialización se muestran en la Tabla 10 .
Tipo berry |
Tipo JSON |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
otro |
|
Tabla 10: Reglas de conversión de tipo Berry a tipo JSON
Ejemplo
import json
json.dump('string') #'"string"'
json.dump('string') #'"string"'
json.dump({0:'item 0','list': [0, 1, 2]}) #'{"0":"item 0","list":[0,1,2]}'
json.dump({0:'item 0','list': [0, 1, 2],'func': print},'format')
#-
{
"0": "item 0",
"list": [
0,
1,
2
],
"func": "<function: 00410310>"
}
-#
Módulo matemático¶
Este módulo se utiliza para proporcionar soporte para funciones
matemáticas, como las funciones trigonométricas y las funciones de raíz
cuadrada de uso común. Para usar el módulo matemático, primero use la
instrucción import math
. Todos los ejemplos de esta sección asumen
que el módulo se ha importado correctamente.
Constante pi
¶
El valor de Pi π es un tipo de número real, aproximadamente igual a 3.141592654.
Ejemplo
math.pi # 3.14159
Función abs
¶
abs(valor)
Descripción
Esta función devuelve el valor absoluto del parámetro, que puede ser un
número entero o un número real. Si no hay parámetros, la función
devuelve 0
, si hay varios parámetros, solo se procesa el primer
parámetro. El tipo de retorno de la función abs
es un número real.
Ejemplo
math.abs(-1) # 1
math.abs(1.5) # 1.5
Función ceil
¶
ceil(valor)
Descripción
Esta función devuelve el valor redondeado hacia arriba del parámetro, es
decir, el valor entero más pequeño mayor o igual que el parámetro. El
parámetro puede ser un número entero o un número real. Si no hay
parámetros, la función devuelve 0
, si hay varios parámetros, solo se
procesa el primero. El tipo de retorno de la función es un número real.
Ejemplo
math.ceil(-1.2) # -1
math.ceil(1.5) # 2
Función floor
¶
floor(valor)
Descripción
Esta función devuelve el valor redondeado hacia abajo del parámetro, que
no es mayor que el valor entero máximo del parámetro. El parámetro puede
ser un número entero o un número real. Si no hay parámetros, la función
devuelve 0
, si hay varios parámetros, solo se procesa el primero. El
tipo de retorno de la función es un número real.
Ejemplo
math.floor(-1.2) # -2
math.floor(1.5) # 1
Función sin
¶
sin(valor)
Descripción
Esta función devuelve el valor de la función seno del parámetro. El
parámetro puede ser un número entero o un número real, y la unidad son
los radianes. Si no hay parámetros, la función devuelve 0
, si hay
varios parámetros, solo se procesa el primer parámetro. El tipo de
retorno de la función es un número real.
Ejemplo
math.sin(1) # 0.841471
math.sin(math.pi * 0.5) # 1
Función cos
¶
cos(valor)
Descripción
Esta función devuelve el valor de la función coseno del parámetro. El
parámetro puede ser un número entero o un número real en radianes. Si no
hay parámetros, la función devuelve 0
, si hay varios parámetros,
solo se procesa el primero. El tipo de retorno de la función es un
número real.
Ejemplo
math.cos(1) # 0.540302
math.cos(math.pi) # -1
Función tan
¶
tan(valor)
Descripción
Esta función devuelve el valor de la función tangente del parámetro. El
parámetro puede ser un número entero o un número real, en radianes. Si
no hay parámetros, la función devuelve 0
, si hay varios parámetros,
solo se procesa el primero. El tipo de retorno de la función es un
número real.
Ejemplo
math.tan(1) # 1.55741
math.tan(math.pi / 4) # 1
Función asin
¶
asin(valor)
Descripción
Esta función devuelve el valor de la función arco seno del parámetro. El
parámetro puede ser un número entero o un número real. El rango de
valores es [−1,1]. Si no hay parámetros, la función devuelve 0
, si
hay varios parámetros, solo se procesa el primero. El tipo de retorno de
la función es un número real y la unidad es radianes.
Ejemplo
math.asin(1) # 1.5708
math.asin(0.5) * 180 / math.pi # 30
Función acos
¶
acos(valor)
Descripción
Esta función devuelve el valor de la función de arco coseno del
parámetro. El parámetro puede ser un número entero o un número real. El
rango de valores es [−1,1]. Si no hay parámetros, la función devuelve
0
, si hay varios parámetros, solo se procesa el primero. El tipo de
retorno de la función es un número real y la unidad es radianes.
Ejemplo
math.acos(1) # 0
math.acos(0) # 1.5708
Función atán
¶
atan(valor)
Descripción
Esta función devuelve el valor de la función arco tangente del
parámetro. El parámetro puede ser un número entero o un número real. El
rango de valores es [−∞,+∞]. Si no hay parámetros, la función devuelve
0
, si hay varios parámetros, solo se procesa el primero. El tipo de
retorno de la función es un número real y la unidad es radianes.
Ejemplo
math.atan(1) * 180 / math.pi # 45
Función sinh
¶
sinh(valor)
Descripción
Esta función devuelve el valor de función de seno hiperbólico del
parámetro. Si no hay parámetros, la función devuelve 0
, si hay
varios parámetros, solo se procesa el primer parámetro. El tipo de
retorno de la función es un número real.
Ejemplo
math.sinh(1) # 1.1752
Función cosh
¶
cosh(valor)
Descripción
Esta función devuelve el valor de la función coseno hiperbólico del
parámetro. Si no hay parámetros, la función devuelve 0
, si hay
varios parámetros, solo se procesa el primero. El tipo de retorno de la
función es un número real.
Ejemplo
math.cosh(1) # 1.54308
Función tanh
¶
tanh(valor)
Descripción
Esta función devuelve el valor de la función tangente hiperbólica del
parámetro. Si no hay parámetros, la función devuelve 0
, si hay
varios parámetros, solo se procesa el primero. El tipo de retorno de la
función es un número real.
Ejemplo
math.tanh(1) # 0.761594
Función sqrt
¶
sqrt(valor)
Descripción
Esta función devuelve la raíz cuadrada del argumento. El parámetro de
esta función no puede ser negativo. Si no hay parámetros, la función
devuelve 0
, si hay varios parámetros, solo se procesa el primero. El
tipo de retorno de la función es un número real.
Ejemplo
math.sqrt(2) # 1.41421
Función exp
¶
exp(valor)
Descripción
Esta función devuelve el valor de la función exponencial del parámetro
en función de la constante natural e. Si no hay parámetros, la función
devuelve 0
, si hay varios parámetros, solo se procesa el primero. El
tipo de retorno de la función es un número real.
Ejemplo
math.exp(1) # 2.71828
Función log
¶
log(valor)
Descripción
Esta función devuelve el logaritmo natural del argumento. El parámetro
debe ser un número positivo. Si no hay parámetros, la función devuelve
0
, si hay varios parámetros, solo se procesa el primero. El tipo de
retorno de la función es un número real.
Ejemplo
log(valor)
Función log10
¶
log10(valor)
Descripción
Esta función devuelve el logaritmo del parámetro en base 10. El
parámetro debe ser un número positivo. Si no hay parámetros, la función
devuelve 0
, si hay varios parámetros, solo se procesa el primero. El
tipo de retorno de la función es un número real.
Ejemplo
math.log10(10) # 1
Función deg
¶
deg(valor)
Descripción
Esta función se utiliza para convertir radianes en ángulos. La unidad
del parámetro es radianes. Si no hay parámetros, la función devuelve
0
, si hay varios parámetros, solo se procesa el primero. El tipo de
retorno de la función es un número real y la unidad es un ángulo.
Ejemplo
math.deg(math.pi) # 180
Función rad
¶
rad(valor)
Descripción
Esta función se utiliza para convertir ángulos a radianes. La unidad del
parámetro es el ángulo. Si no hay parámetros, la función devuelve 0
,
si hay varios parámetros, solo se procesa el primero. El tipo de retorno
de la función es un número real y la unidad es radianes.
Ejemplo
math.rad(180) # 3.14159
Función pow
¶
pow(x, y)
Descripción
El valor de retorno de esta función es el resultado de la expresión x
y , que es el parámetro x
elevado a y
. Si los parámetros
no están completos, la función devuelve 0
, si hay parámetros
adicionales, solo se procesan los dos primeros parámetros. El tipo de
retorno de la función es un número real.
Ejemplo
math.pow(2, 3) # 8
Función srand
¶
srand(valor)
Descripción
Esta función se utiliza para establecer la semilla del generador de números aleatorios. El tipo del parámetro debe ser un número entero.
Ejemplo
math.srand(2)
Función rand
¶
rand()
Descripción
Esta función se utiliza para obtener un número entero aleatorio.
Ejemplo
math.rand()
Módulo de tiempo¶
Este módulo se utiliza para proporcionar funciones relacionadas con el tiempo.
Función time
¶
time()
Descripción
Devuelve la marca de tiempo actual. La marca de tiempo es el tiempo transcurrido desde Unix Epoch (1 de enero de 1970 00:00:00 UTC), en segundos.
Función dump
¶
dump(ts)
Descripción
La marca de tiempo de entrada ts
se convierte en un map
de
tiempo, y la correspondencia clave-valor se muestra en la siguiente
tabla:
clave |
valor |
clave |
valor |
clave |
valor |
---|---|---|---|---|---|
`` ‘year’`` |
Año (desde 1900) |
|
Mes (1-12) |
` ‘day’` |
Día (1-31) |
`` ‘hour’`` |
Hora (0-23) |
` ‘min’` |
Puntos (0-59) |
` ‘sec’` |
Segundos (0-59) |
|
Semana (1-7) |
Tabla 11: La relación clave-valor del valor de retorno de la función ``time.dump``
Función clock
¶
clock()
Descripción
Esta función devuelve el tiempo transcurrido desde el inicio de la ejecución del intérprete hasta que se llama a la función en segundos. El valor de retorno de esta función es del tipo “real” y su precisión de tiempo está determinada por la plataforma específica.
Módulo de cadena (string)¶
El módulo cadena
proporciona funciones de procesamiento de cadenas.
Para usar el módulo de cadena, primero use la instrucción
import string
. Todos los ejemplos de esta sección asumen que el
módulo se ha importado correctamente.
Función count
¶
string.count(s, sub[, inicio[, fin]])
Cuenta el número de ocurrencias de la subcadena en la cadena s. Busque
desde la posición entre inicio
y fin
de s
(el valor
predeterminado es 0 y tamaño(s)).
Función split
¶
string.split(s, pos)
Divide la cadena s en dos subcadenas en la posición pos
y devuelve
la lista de esas cadenas.
string.split(s, sep[, num])
Divide la cadena s en subcadenas dondequiera que ocurra sep, y devuelve la lista de esas cadenas. Dividir como máximo un número de veces (el valor predeterminado es string.count(s, sep)).
Función find
¶
string.find(s, sub[, inicio[, fin]])
Compruebe si la cadena s contiene la subcadena sub. Si se especifican el inicio y el final (el valor predeterminado es 0 y el tamaño(s)), se buscarán en este rango.
Función hex
¶
hex(numero)
Convertir número a cadena hexadecimal.
Función byte
¶
byte(s)
Obtiene el valor del código del primer byte de la cadena s.
Función char
¶
char(numero)
Convierte el número usado como código en un carácter.
Función format
¶
string.format(fmt[, args])
Devuelve una cadena formateada. El patrón que comienza con ‘%’ en la plantilla de formato fmt será reemplazado por el valor de [args]: %[flags][fieldwidth][.precision]type
Ti po |
Descripción |
---|---|
%d |
Entero decimal |
%o |
Entero octal |
%x |
Entero hexadecimal en minúsculas |
%X |
Entero hexadecimal en mayúsculas |
%x |
Entero octal en minúsculas |
%X |
Entero octal en mayúsculas |
%f |
Punto flotante en la forma [-]nnnn.nnnn |
%e %E |
Punto flotante en exp. forma [-]n.nnnn e [+|-]nnn, mayúsculas si %E |
%g %G |
Punto flotante como %f si −4 < exp. ≤ precision, sino como %e; mayúsculas si %G |
%c |
Carácter que tiene el código pasado como entero |
%s |
Cadena sin ceros incrustados |
%q |
Cadena entre comillas dobles, con caracteres especiales escapados |
%% |
El carácter ‘%’ (escapado) |
Tipo |
Descripción |
---|---|
Justificación a la izquierda, el valor predeterminado es justificación a la derecha |
|
antepone el signo (se aplica a los números) |
|
( espa cio) |
Antepone signo si es negativo, de lo contrario espacio |
# |
Agrega “0x” antes de %x, fuerza el punto decimal; para %e, %f, deja ceros finales para %g |
Ancho de campo y precisión |
Descripción |
---|---|
n |
Pone al menos n caracteres, rellena con espacios en blanco |
0n |
Pone al menos n caracteres, teclado izquierdo con ceros |
.n |
Usa al menos n dígitos para números enteros, redondee a n decimales para punto flotante o no más de n caracteres. para cadenas |
Módulo os
¶
El módulo OS proporciona funciones relacionadas con el sistema, como funciones relacionadas con archivos y rutas. Estas funciones están relacionadas con la plataforma. Actualmente, los códigos de estilo Windows VC y POSIX se implementan en el intérprete de Berry. Si se ejecuta en otras plataformas, no se garantiza que se proporcionen las funciones en el módulo del sistema operativo.
[COMPLETAR]
Módulo global
¶
El módulo global
proporciona una forma de acceder a las variables
globales a través de un módulo. El compilador Berry comprueba que existe
un global al compilar el código. Sin embargo, hay casos en los que los
globales se crean dinámicamente por código y aún no se conocen en tiempo
de compilación. El uso del módulo global
da total libertad para
acceder a variables globales estáticas o dinámicas.
Acceder a un global es simplay hecho con global.<name>
para leer y
escribir. También puede usar la sintaxis especial global.(nombre)
si
nombre
es una variable que contiene el nombre del global como
cadena.
Ejemplo:
> import global
> a = 1
> global.a
1
>
> b
syntax_error: stdin:1: 'b' no declarado (primer uso en esta función)
> global.b = 2
> b
2
> global.b
2
> var nombre = "b"
> global.(nombre)
2
Llamar a global()
devuelve la lista de todos los nombres globales
actualmente definidos (los componentes integrados no están incluidos).
> import global
> a = 1
> global.b = 2
> global()
['_argv', 'b', 'global', 'a']
global.contains(<nombre)> -> bool
proporciona una manera fácil de
saber si un nombre global ya está definido.
> import global
> global.contains("g")
false
> g = 1
> global.contains("g")
true
Módulo introspect
¶
El módulo introspect
proporciona primitivas para acceder
dinámicamente a variables o módulos. Usar con import introspect
.
introspect.members(objeto: clase o módulo o instancia o nil) -> lista
devuelve la lista de nombres de miembros para la clase
,
instancia
o módulo
. Tenga en cuenta que no incluye miembros
virtuales potenciales creados a través de member
y setmember
.
introspect.members()
devuelve la lista de variables globales (sin
incluir las incorporadas) y es equivalente a global()
introspect.get(objeto: clase o instancia o módulo, nombre:cadena) -> cualquiera
e
introspect.set(objeto: clase o instancia o módulo, nombre:cadena, valor:cualquiera) -> nil
permite leer y escribir cualquier miembro por su nombre.
introspect.get(o, "a")
es equivalente a oa
,
introspect.set(o, "a", 1)
es equivalente a oa = 1
. También hay
una sintaxis alternativa: o.("a")
es equivalente a oa
y
o.("a) = 1
es equivalente a oa = 1
.
introspect.module(nombre:cadena) -> any
es equivalente a
import nombre
excepto que no crea la variable global o local, sino
que devuelve el módulo. Esta es la única manera de cargar un módulo con
un nombre dinámico, import nombre
solo toma un nombre estático.
introspect.toptr(addr:int) -> comptr
convierte un número entero en
un puntero comptr. introspect.fromptr(addr:comptr) -> int
hace lo
contrario y convierte un puntero en un int. Advertencia: usar con
cuidado. En plataformas donde int
y void*
no tienen el mismo
tamaño, estas funciones seguramente darán resultados inutilizables.
introspect.ismethod(f:function) -> bool
comprueba si la función
proporcionada es un método de una instancia (tomando a sí mismo como
primer argumento) o una función simple. Esto se usa principalmente para
evitar un error común de pasar un método de instancia como callback,
donde debe usar un cierre que capture la instancia como
/ -> self.do()
.
Módulo solidify
¶
Este módulo permite solidificar el bytecode de Berry en flash. Esto permite ahorrar RAM ya que el código está en ROM. Esto lo convierte en una buena alternativa a las funciones nativas de C.
Ver 8.4 Solidificación