dir(re.compile(pattern))
não retorna padrão como um dos elementos da lista. Ou seja, ele retorna:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
De acordo com o manual, ele deve conter
os nomes dos atributos do objeto, os nomes dos atributos da classe e recursivamente os atributos das classes base da classe.
Diz também que
A lista não está necessariamente completa.
Existe uma maneira de obter a lista completa ? Eu sempre assumi que o dir retorna uma lista completa, mas aparentemente não ...
Além disso: existe uma maneira de listar apenas atributos? Ou apenas métodos?
Edit: este é realmente um bug em python -> supostamente é corrigido no ramo 3.0 (e talvez também no 2.6)
dir()
ou o módulo de inspeção geralmente é o caminho certo para fazê-lo. Você usou ore
módulo apenas como exemplo ou deseja alcançar um objetivo especial?__dir__()
Respostas:
Para a lista completa de atributos, a resposta curta é: não. O problema é que os atributos são realmente definidos como os argumentos aceitos pela
getattr
função interna. Como o usuário pode reimplementar__getattr__
, permitindo subitamente qualquer tipo de atributo, não há uma maneira genérica possível de gerar essa lista. Adir
função retorna as chaves no__dict__
atributo, ou seja, todos os atributos acessíveis se o__getattr__
método não for reimplementado.Para a segunda pergunta, isso realmente não faz sentido. Na verdade, métodos são atributos que podem ser chamados, nada mais. Você pode filtrar atributos que podem ser chamados e, usando o
inspect
módulo, determinar os métodos, métodos ou funções da classe.fonte
É por isso que o novo
__dir__()
método foi adicionado no python 2.6Vejo:
fonte
__dir
__ () é um método de objeto, não uma função - por favor leia as ligações na resposta e estapprint({k:getattr(ojb,k) for k in obj.__dir__()})
Aqui está uma adição prática às respostas de PierreBdR e Moe:
dir()
parece suficiente.Para classes de estilo antigo , podemos pelo menos fazer o que um módulo padrão faz para oferecer suporte à conclusão de guias: além de
dir()
procurar__class__
e, em seguida, procurar__bases__
:(O código e a saída do teste são excluídos por questões de concisão, mas basicamente para objetos de estilo novo parecemos ter os mesmos resultados
get_object_attrs()
que paradir()
e para classes de estilo antigo, a principal adição àdir()
saída parece ser o__class__
atributo.)fonte
Apenas para complementar:
dir()
é a ferramenta mais poderosa / fundamental. ( Mais recomendado )Soluções que
dir()
não sejam apenas a maneira de lidar com a saída dedir()
.Listando atributos de segundo nível ou não, é importante fazer a peneiragem sozinho, porque às vezes você pode filtrar os vars internos com os sublinhados principais
__
, mas às vezes pode precisar da__doc__
cadeia de caracteres de documentos.__dir__()
edir()
retorna conteúdo idêntico.__dict__
edir()
são diferentes.__dict__
retorna conteúdo incompleto.IMPORTANTE :
__dir__()
às vezes pode ser substituído por uma função, valor ou tipo pelo autor para qualquer finalidade.Aqui está um exemplo:
TypeError: o descritor
__dir__
do'object'
objeto precisa de um argumentoO autor do PyTorch modificou o
__dir__()
método para algo que requer um argumento. Essa modificaçãodir()
falha.Se você deseja que um esquema confiável percorra todos os atributos de um objeto, lembre-se de que todos os padrões pitônicos podem ser substituídos e podem não se sustentar , e todas as convenções podem não ser confiáveis.
fonte
É assim que eu faço, útil para objetos personalizados simples aos quais você continua adicionando atributos:
Dado um objeto criado com
obj = type("Obj",(object,),{})
, ou simplesmente:Adicione alguns atributos:
em seguida, para obter um dicionário apenas com os atributos personalizados:
fonte