Solucionar “Trying to get property of non-object» en Prestashop

error prestashop

Hola, es muy probable que estes recibiendo el error “Trying to get property of non-object» en tu página Prestashop.

Si tienes un ecommerce con actualización automática de los productos desde la web del  proveedor, este error puede surgir en cualquier momento.

Veamos este error esta diciendo que estas tratando de «tomar una propiedad desde algo que no es un objeto» y eso debe ser revisado.

Recibes este error porque tienes activado el modo debug.

Si tu página se ve y funciona bien, es muy probable que puedas obviar este warning y otros de su tipo.

Por eso, si no quieres sumirte en el código, basta con desactivar el modo DEBUG, de tu pagina para no recibir más el error.

MODO DEBUG ¿que es PRESTASHOP?

El Modo DEBUG en PrestaShop,  es una  variable con la cual se puede activar o desactivar el modo de depuración.

Mediante ella, podemos visualizar todos los  mensajes de depuración y avisos PHP, que están diseñados para que  el desarrollador pueda detectar  errores, que de otro modo no veria.

En este link puedes escribirme si necesitas algún tipo de colaboración Contacto

Desactivar el modo DEBUG

Para desactivar el modo DEBUG, debemos acceder por FTP a nuestra tienda y modificar el archivo “defines.inc.php”.

Su ubicación es “directorio/config/defines.inc.php”.

En este caso directorio es el directorio raíz donde hemos instalado PrestaShop.

La variable “_PS_MODE_DEV_,  es la que que activa el modo DEBUG,  y posee dos valores “TRUE= activado” y “FALSE= desactivado”

Una vez dentro  solo deberemos cambiar la linea:

define(‘_PS_MODE_DEV_’, true);

y cambiar el valor de True a False:

define(‘_PS_MODE_DEV_’, false);

El modo DEBUG, dejara de estar activo y los errores dejaran de llegar.

Sabiendo esto ya puedes activar o desactivar el modo DEBUG a tu voluntad para evaluar errores.

Fue tu amor, más difícil y más fallo, que un contrabando de gallos, pasando al amanecer.

W. Chirino

Index Error: Index Out of Range en Python

python error

El error en Python, Index Error: Index Out of Range, extiende de la clase LookupError, que se hereda de la BaseException, que viene predefinida en el lenguaje.

Dentro de la clase LookupError, se enumeran dos errores:

BaseException
  LookupError
    IndexError
      KeyError

¿Qué significa el error de Python, Index Error: Index Out of Range?

Como Python admite la indexación de elementos de lista, esta preparado para acceder a elementos iterables y operar con ellos, realizando acciones como imprimir o recorrer elementos.

El problema viene cuando se menciona un índice en su código que está fuera del rango de la lista, entonces  Python arrojará un IndexError que le indicará que el índice de la lista está fuera del rango.

Por ejemplo cuando intentamos acceder a un elemento usando un índice que está fuera del rango de esa lista, recibirá un error de  Index Error: Index Out of Range.

En en el siguiente caso, imprimir la posición (lista [8]) se refiere a una posición que no existe que no existe, ya que la primera posición de cualquier arreglo es 0, por tanto si la lista tiene 7 registros, la posición más alta es [6]

lista = (‘a’,2,3,5,6,’b’,8)
print(lista[8])

Si estas recibiendo este error basta con que te asegures que estas pidiendo una posición dentro del rango correcto.

Puedes ver mas como manejar este error aquí

…., si avanzo sígueme, si me detengo empújame, si retrocedo mátame…….

F. País

FileNotFoundError: [Errno 2] No such file or directory

python error

El error  FileNotFoundError: [Errno 2] No such file or directory, es un error común que lanza la librería OS.

En esencia este error indica que estámos intentando acceder a un archivo o carpeta que no existe, ya sea porque no está presente en la ruta de archivo en particular o porque se ha cambiado su nombre.

Normalmente verá un IOError si intenta leer o escribir en un archivo que no existe usando una instrucción open () del tipo

f = open ('nombre de archivo.txt')

Para corregirlo lo primero es  comprobar de antemano, que se está refiriendo al archivo o carpeta correcto.

Un error común es que corramos

python script.py

Cuando deberíamos llamar a la ruta correcta de esta forma

python. / script.py

Ver otros errores en Python en mi blog

Otro error que puede darse es que nuestro archivo comience con la letra n, y se confunda con una secuencia de escape; podría pasar algo asi:

path_name = "C:\name.txt " 

En este caso Python considerará \n como una secuencia de escape y nunca encontrará el archivo name.txt

Capturar el error [Errno 2] No such file or directory

Podemos capturar el error para emplearlo a conveniencia. Veamos aca algunas variantes, donde si el archivo no es encontrado manejaremos un mensaje de salida

Os

import os

path_name = "filename.txt"

if os.path.isfile(path_name):
   print("File exists")
f = open(path_name)
#Ejecutar aquí otras operaciones
f.close()

else :
   print("El archivo no existe, se encontró un error tipo IOError ")

Pathlib

from pathlib
import Path
path_name = "filename.txt"
p = Path(path_name)
if p.is_file():
   print("File exists")
f = open(path_name)
#Ejecutar aquí otras operaciones
f.close()

else :
   print("El archivo no existe, se encontró un error tipo IOError ")

Try – Except primera variante

try:
f = open("filename.txt")
#Execute other operations
f.close()
except IOError as io:
   print(io)

Try – Except segunda variante

try:
f = open("filename.txt")
#Ejecutar aquí otras operaciones
f.close()
except IOError:
   print("El archivo no existe, se encontró un error tipo IOError ")

Y hasta aquí. Espero que este post ayude a alguien.

Muchas gracias

La ira no tiene alas y es tímida, la estupidez en cambio es desenvuelta y aventurera. Por  eso volcamos nuestra ira en los que nos quieren, y nos esforzamos por complacer , a los que no importamos nada.

Y

Cómo generar una excepción NotImplementedError en Python

python error

NotImplementedError extiende de BaseException. En este post, explicaré de modo simple su comportamiento de forma tal  que comprenda como generar una excepción NotImplementedError en Python.

Al extender de BaseException esto significa que es una excepción incorporada y como todas las de su tipo, puede ser generada.

Genere el NotImplementedError así:

from abc import ABC, abstractmethod

class CasaBase(ABC):
	@abstractmethod
	def color(self):
		raise NotImplementedError("Escriba  una subclase que implemente el metodo")

class Chalet(CasaBase):
	def color(self):
		return 'rojo'

class Adosado(CasaBase):
	def color(self):
		super().color()

chalet = Chalet()
adosado=Adosado()

print (chalet.color())
print(adosado.color()) # esto lanzará una excepcion NotImplementedError: "Escriba subclases que lo implementen”) 

Es así de simple; veamos la salida.

rojo
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-11-b400534f9be6> in <module>
     18 
     19 print (chalet.color())
---> 20 print(adosado.color()) # esto lanzará una excepcion NotImplementedError: "Escriba subclases que lo implementen”)

<ipython-input-11-b400534f9be6> in color(self)
     12 class Adosado(CasaBase):
     13         def color(self):
---> 14                 super().color()
     15 
     16 chalet = Chalet()

<ipython-input-11-b400534f9be6> in color(self)
      4         @abstractmethod
      5         def color(self):
----> 6                 raise NotImplementedError("Escriba  una subclase que implemente el metodo")
      7 
      8 class Chalet(CasaBase):

NotImplementedError: Escriba  una subclase que implemente el metodo

No obstante, esto es útil para generar una excepción, pero es una labor manual, que tomará mucho tiempo implementar en códigos mas largos.

Puede ver mas sobre este error aquí

Entonces, ¿ cómo generar una excepción NotImplementedError en Python?

Si se encuentra con NotImplementedError, la forma recomendada de manejarlo, es implementar el método abstracto para el que se genera el error, directamente.

Debido a que NotImplementedError lo define el usuario, Python no puede generar este error por sí solo; por lo tanto, deberá emplear algún paquete que  ya esté utilizando o el  propio código que esta escribiendo y luego implementar lo que aun falte.

Veamos un ejemplo.  

from abc import ABC, abstractmethod

class CasaBase(ABC):
	@abstractmethod
	def color(self):
		raise NotImplementedError("Escriba  una subclase que implemente el metodo")

Ahora se generará el NotImplementedError.

Así que todo lo que necesita hacer para manejar este error, es implementar la función color por una subclase antes de que se use.

NotImplementedError en Python

python error

Según su documentación, el NotImplementedError en Python ocurre, cuando un método abstracto carece de la clase derivada requerida, para anularlo, lo que genera esta excepción.

Analicemos esto un poco.

Si bien no proporciona clases abstractas, Python permite usar el módulo, Abstract Base Classes (ABC).

Las clases abstractas son útiles porque crean escenarios para otras clases y establecen  al mismo tiempo, un conjunto de métodos.

from abc import ABC, abstractmethod

class CasaBase(ABC):

	@abstractmethod
	def color(self):
		raise NotImplementedError("Escriba  una subclase que implemente el metodo")

Una clase base abstracta, incluye uno o más métodos abstractos (entiéndase, métodos que han sido declarados, pero carecen de implementación).

Las subclases, o clases secundarias, son necesarias para implementar estos métodos abstractos.

Por tanto, si usted recibe un NotImplementedError en Python esto se deberá a una de estas razones:

1. No ha creado una clase derivada, que anule el método abstracto

2. No ha implementado la clase.

Puede ver aquí como generar una excepción del error NotImplementedError

El amor siempre empieza soñando y termina en insomnio

R. Arjona

TypeError: static() got an unexpected keyword argument ‘document_root’ in Django»

django error

El error typeError: static() got an unexpected keyword argument ‘document_root, puede aparecer, en Django cuando intentamos añadir en nuestro urls.py

+= static(settings.MEDIA_URL, documnet_root=settings.MEDIA_ROOT)

Esta modificación de las urls, la hacemos para decirle a Django, en qué lugar se encuentran nuestros archivos media.

Si nos fijamos en el contenido de nuestro archivo settings.py, debe aparecer la dirección que indica , dónde guardamos nuestros archivos estáticos y en que lugar nuestros archivos tipo media.

Es algo asi

MEDIA_URL = '/media/'
 MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media')
 STATIC_URL = '/static/' 

Dicho esto, el error ‘TypeError: static() got an unexpected keyword argument ‘document_root‘ puede proceder de diversas fuentes, dos de las que conozco y me resultan más comunes son:

 Importar de modo incorrecto la ruta del método static utilizando:

 from django.templatetags.static import static

cuando deberiamos importar

 from django.conf.urls.static import static   

El primero de ellos nos permite manejar archivos estáticos, como css, javascript o imágenes.

El segundo  es una una función helper que nos devuelve la  url,  donde se encuentra un contenido especifico  y su estructura es:

static.static(prefixview=django.views.static.serve**kwargs)

import *

Si, así es. El segundo error es emplear el uso de import *, que por más que pueda parecer cómodo , me ha traído algún de un dolor de cabeza.

En este articulo pueden ampliar conocimiento sobre sus inconvenientes.

“….El amor siempre empieza soñando y termina en insomnio“

R.Arjona

No se muestran los gráficos en Seaborn

seaborn error

Si tienes problemas al visualizar tus datos por que no se muestran los gráficos en Seaborn, tu solución podría ser esta.

Los gráficos creados con Seaborn deben mostrarse como gráficos Matplotlib ordinarios. Esto se puede hacer usando :

plt.show ()

Basta importar  el módulo matplotlib.pyplot y muestre sus gráficos con

import matplotlib.pyplot as plt

plt.show()

Si en tu caso estas empleando Python notebook puedes invocar el inline para eliminar la necesidad de llamar a show() después de cada trazado.

Puedes llamarlo así:

%matplotlib inline

Puedes contactar conmigo aquí

Quien va en busca de montañas no puede detenerse a recoger las piedras del camino.

J. Martí

MemoryError en Python

python error

Todas las excepciones de Python heredan de la clase BaseException o se extienden desde una clase heredada en la misma. La jerarquía de excepciones completa de este error es:

*BaseException

*Excepción.

*MemoryError

En la mayoría de las situaciones, un MemoryError en Python indica una falla importante en la aplicación actual.

Por ejemplo, una aplicación que acepta archivos o entrada de datos de usuario podría ejecutar MemoryErrors si la aplicación no tiene suficientes controles que validen y saneen las entradas.

Hay toneladas de escenarios en los que los límites de memoria pueden ser problemáticos, pero para nuestra ilustración de código nos quedaremos con una asignación simple en la memoria local usando cadenas y arreglos.

El factor más importante para determinar si es probable una aplicacion experimente MemoryErrors es en realidad la arquitectura de la computadora en la que se ejecuta el sistema.

O, incluso más específicamente, la arquitectura que usa su versión de Python.

Versión Python y MemoryError

Si está utilizando Python de 32 bits, la asignación de memoria máxima otorgada al proceso de Python,  es excepcionalmente baja.

El límite máximo específico de asignación de memoria varía y depende de su sistema, pero por lo general es de alrededor de 2 GB y  no más de 4 GB.

Por otro lado, las versiones de Python de 64 bits, están más o menos limitadas solo por la memoria disponible del sistema.

En términos prácticos, es poco probable que un intérprete de Python de 64 bits experimente problemas de memoria, o si lo hace, es porque hay  un problema mucho mayor que está afectando a todo el  resto del sistema.

Puedes ver más información sobre este error, en Stackoverflow

En definitiva debido a que existe una gran diferencia entre las versiones de Python de 32 y 64 bits, la solución a tu problema de memoria podría ser  cambiar a Python de 64 bits y ejecutar el mismo código.

Si después de unas pocas iteraciones no se ha lanzado MemoryError se debe a la versión de Python que estas utilizando.

Puedes cortar las rosas una a una, ……. pero la primavera seguirá en el jardín

J.A. Buesa

Manejar el AssertionError en Python

python error

En este artículo, exploraremos el AssertionError, comenzando por el lugar donde reside en la jerarquía general de clases de excepción de Python.

Un AssertionError, solo puede ocurrir cuando falla una declaración de aserción (afirmación), por lo tanto, un AssertionError nunca debe ser una sorpresa o aparecer en una sección del código de su aplicación que sea inesperado.

Cada vez que escribas una declaración de aserción, también debes proporcionar un código de manejo de excepciones apropiado, para hacer frente a un error de aserción inevitable.

También hara una prueba con código funcional, que ilustra cómo se pueden usar las declaraciones assert y cómo la falla de dicha declaración generará un AssertionError que debe detectarse y manejarse, como cualquier otro error

Herencia

Todas las excepciones de Python heredan de la clase BaseException, o bien  extienden desde una clase heredada en la misma. La jerarquía de excepciones completa de este error es:

• BaseException

o Excepción

 AssertionError

Código

A continuación, se muestra el ejemplo de código completo que usaremos en este artículo. Se puede copiar y pegar si desea jugar con el código usted mismo y ver cómo funciona todo.

import datetime

from gw_utility.book import Book
from gw_utility.logging import Logging


def main():
    Logging.line_separator("BOTH INCLUDE PUBLICATION DATES", 50, '+')
    # Creamos dos Books con argumentos identicos.
    the_stand = Book("The Stand", "Stephen King", 1153, datetime.date(1978, 1, 1))
    the_stand_2 = Book("The Stand", "Stephen King", 1153, datetime.date(1978, 1, 1))

    # Afirma la equivalencia de los Books.
    check_equality(the_stand, the_stand_2)

    Logging.line_separator("ONE MISSING PUBLICATION DATE", 50, '+')
    # Create two Books, one without publication_date argument specified.
    the_hobbit = Book("The Hobbit", "J.R.R. Tolkien", 366, datetime.date(1937, 9, 15))
    the_hobbit_2 = Book("The Hobbit", "J.R.R. Tolkien", 366)

    # Afirma la equivalencia de los Books.
    check_equality(the_hobbit, the_hobbit_2)


def check_equality(a, b):
    """Afirmacion de equivalencia de dos objetos pasados..

    :param a: First object.
    :param b: Second object.
    :return: Indicates if assertion was successful.
    """
    try:
        Logging.line_separator("ASSERTING EQUIVALENCE OF...")
        # Output objects using __str__ method.
        Logging.log(a)
        Logging.log(b)
        # Afirmacion de la  equivalencia de los objetos indicando que la inigualdad ha fallado..
        assert a == b, "The objects ARE NOT equal."
        # Indica que la   assertion ha sucedido.
        Logging.log("The objects are equal.")
        return True
    except AssertionError as error:
        # Salida  esperada de un AssertionErrors.
        Logging.log_exception(error)
    except Exception as exception:
        # Salida de una excepcion inesperada.
        Logging.log_exception(exception, False)


if __name__ == "__main__":
    main()

import datetime


class Book:
    author: str
    page_count: int
    publication_date: datetime.date
    title: str

    def __eq__(self, other):
        """Determina si los objetos pasados son equivalentes a un objeto actual. """
        return self.__dict__ == other.__dict__

    def __init__(self, title: str = None, author: str = None, page_count: int = None,
                 publication_date: datetime.date = None):
        """Inicializa una instancia de Book.

        :param title: Title of Book.
        :param author: Author of Book.
        :param page_count: Page Count of Book.
        :param publication_date: Publication Date of Book.
        """
        self.author = author
        self.page_count = page_count
        self.publication_date = publication_date
        self.title = title

    def __len__(self):
        """Devuelve el length del titulo."""
        return len(self.title)

    def __str__(self):
        """Devuelve un string formateado como represntacion de   Book."""
        date = '' if self.publication_date is None else f', published on {self.publication_date.__format__("%B %d, %Y")}'
        return f'\'{self.title}\' by {self.author} at {self.page_count} pages{date}.'

Como funciona un assert (afirmación)

Para ilustrar cómo funcionan las afirmaciones, realizaremos algunas pruebas de equivalencia básicas para determinar si un objeto es igual a un segundo objeto.

Para hacer las cosas un poco más interesantes, hemos creado una clase Book personalizada simple, que almacena información básica sobre cada instancia de Book.

class Book:
    author: str
    page_count: int
    publication_date: datetime.date
    title: str

    def __eq__(self, other):
        """Determines if passed object is equivalent to current object."""
        return self.__dict__ == other.__dict__

    def __init__(self, title: str = None, author: str = None, page_count: int = None,
                 publication_date: datetime.date = None):
        """Inicializando instancia de Book.

        :param title: Title of Book.
        :param author: Author of Book.
        :param page_count: Page Count of Book.
        :param publication_date: Publication Date of Book.
        """
        self.author = author
        self.page_count = page_count
        self.publication_date = publication_date
        self.title = title

    def __len__(self):
        """Returns the length of title."""
        return len(self.title)

    def __str__(self):
        """Returns a formatted string representation of Book."""
        date = '' if self.publication_date is None else f', published on {self.publication_date.__format__("%B %d, %Y")}'
        return f'\'{self.title}\' by {self.author} at {self.page_count} pages{date}.'

Una vez realizada la  asignación de propiedad de instancia en el método __init __ (self, title: str = None, author: str = None, page_count: int = None, publishing_date: datetime.date = None).

Podemos iniciar el proceso de comparación.

Vemos que tenemos un método __eq __ (self, other), al que se llamará cuando se intente verificar la equivalencia entre una instancia de Book y otro objeto.

Para manejar esto, usamos la propiedad incorporada __dict__ como una forma de comparación (aunque podríamos optar también por __str __ (self)).

El código que usaremos para probar algunas instancias de objetos comienza con el método check_equality (a, b)

def check_equality(a, b):
    """Afirmando la equivalencia de dos objetos 

    :param a: First object.
    :param b: Second object.
    :return: Indica que el assertion fue exitoso.
    """
    try:
        Logging.line_separator("ASSERTING EQUIVALENCE OF...")
        # Salida de objetos usando __str__ method.
        Logging.log(a)
        Logging.log(b)
        # Assert de equivalencia de objetos, indicando que la desigualdad ha fallado 
        assert a == b, "The objects ARE NOT equal."
        # Indica que la afirmación se realizó correctamente.

        Logging.log("The objects are equal.")
        return True
    except AssertionError as error:
        # Esperando salida de un AssertionError.
        Logging.log_exception(error)
    except Exception as exception:
        # Salida de una excepción inesperada
        Logging.log_exception(exception, False)

La mayor parte del código  que tenemos, maneja la salida de información al registro (log) sobre la prueba de igualdad.

La línea crítica es assert a == b, "Los objetos NO SON iguales", que realiza una afirmación de que ambos objetos pasados ​​son equivalentes entre sí.

El segundo argumento de una declaración de aserción es el mensaje de fallo que se usa como argumento si ocurre una falla.

En términos prácticos, este argumento de mensaje de falla se agrega a la propiedad .args de la instancia AssertionError, dándonos un mensaje de error real cuando detectamos la excepción en otra parte de nuestro código.

Dado que una declaración de aserción fallida siempre genera un AssertionError, si la ejecución continúa más allá de esa declaración, podemos asumir que los objetos son iguales y la salida al registro.

Con todo configurado, podemos probar nuestro método de aserción creando un par de instancias de Book, the_stand y the_stand_2:

def main():
    Logging.line_separator("BOTH INCLUDE PUBLICATION DATES", 50, '+')
    # Creando dos  Books con argumentos identicos.
    the_stand = Book("The Stand", "Stephen King", 1153, datetime.date(1978, 1, 1))
    the_stand_2 = Book("The Stand", "Stephen King", 1153, datetime.date(1978, 1, 1))

    # Comparando equivalencia de los libros
    check_equality(the_stand, the_stand_2)

    # ...

Pasar ambas instancias de Book a check_equality (a, b) produce el siguiente resultado:

+++++++++ BOTH INCLUDE PUBLICATION DATES +++++++++
----- ASSERTING EQUIVALENCE OF... ------
'The Stand' by Stephen King at 1153 pages, published on January 01, 1978.
'The Stand' by Stephen King at 1153 pages, published on January 01, 1978.
The objects are equal

Como podemos suponer lógicamente, dado que todos los argumentos pasados ​​a ambos inicializadores de Libro eran idénticos, nuestra declaración assert  tuvo éxito y vemos la salida de confirmación en el registro. 

Sin embargo, veamos qué sucede si intentamos una segunda prueba con dos objetos Book ligeramente diferentes, donde una instancia no pasó un argumento publication_date durante la inicialización:

Logging.line_separator("ONE MISSING PUBLICATION DATE", 50, '+')
# Creando dos Books, uno de ello sin el argumento publication_date 
the_hobbit = Book("The Hobbit", "J.R.R. Tolkien", 366, datetime.date(1937, 9, 15))
the_hobbit_2 = Book("The Hobbit", "J.R.R. Tolkien", 366)

# Comparando equivalencia de los libros
check_equality(the_hobbit, the_hobbit_2)

 

Como probablemente pueda adivinar, estos dos objetos Book no se consideran iguales, ya que sus propiedades __dict__ subyacentes son diferentes entre sí.

En consecuencia, nuestra declaración de aserción falla y genera un AssertionError en la salida:

++++++++++ ONE WITHOUT PUBLICATION DATE ++++++++++
----- ASSERTING EQUIVALENCE OF... ------
'The Hobbit' by J.R.R. Tolkien at 366 pages, published on September 15, 1937.
'The Hobbit' by J.R.R. Tolkien at 366 pages.
[EXPECTED] AssertionError: The objects ARE NOT equal.

Espero que lo hayas entendido. Gracias

…. hay que levantarse cada mañana con una esperanza y dormirse cada noche con una meta….

Y

FloatingPointError en Python

python error

El  FloatingPointError en Python, indica que algo salió mal, al efectuar  un cálculo de punto flotante.

Las causas del error por tanto pueden ser varias, y su manejo dependerá de tus objetivos.

Si necesitamos evitarlo, el empleo de decimal(), puede ayudarnos,  ya que  contienen varias funciones integradas para operaciones matemáticas simples (por ejemplo, sqrt); sin embargo es posible que los resultados de estas funciones no siempre coincidan con la función correspondiente en matemáticas u otros módulos con mayor precisión.

Justo por esto es más recomendable emplear math(), por su mayor exactitud.

Lo importante que debes saber, es que la causa de este  error  muchas veces está, en las características de los números con base N.

Translate »