Python 2 e 3, sem importações, filtrando objetos por seus endereços
Soluções resumidas:
Retorne dict {attribute_name: attribute_value} , objetos filtrados. ie{'a': 1, 'b': (2, 2), 'c': [3, 3]}
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
Lista de retorno [attribute_names] , objetos filtrados. ie['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Lista de retorno [attribute_values] , objetos filtrados. ie[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Não filtrando objetos
Removendo a if
condição. Retorna{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}
{k: val for k, val in self.__dict__.items()}
Solução em longo prazo
Desde que a implementação padrão de __repr__
não seja substituída, a if
instrução retornará True
se a representação hexadecimal do local na memória de val
estiver na __repr__
string de retorno.
Em relação à implementação padrão de, __repr__
você pode achar útil esta resposta . Em resumo:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Que retorna uma string como:
<__main__.Bar object at 0x7f3373be5998>
A localização na memória de cada elemento é obtida por meio do id()
método.
Python Docs diz sobre id ():
Retorna a “identidade” de um objeto. Este é um número inteiro garantido como único e constante para este objeto durante sua vida útil. Dois objetos com tempos de vida não sobrepostos podem ter o mesmo valor id ().
Detalhe de implementação do CPython: Este é o endereço do objeto na memória.
Tente você mesmo
class Bar:
def __init__(self):
self.a = 1
self.b = (2, 2)
self.c = [3, 3]
self.d = {4: 4}
self.e = lambda: "5"
self.f = object()
#__str__ or __repr__ as you prefer
def __str__(self):
return "{}".format(
# Solution in Short Number 1
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
)
# Main
print(Bar())
Resultado:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Nota :