2015-10-09 3 views
0

я писал код в Python с использованием ldapsearch и наткнулся на эту ссылку в rosettacode.orgPython итерацию над структура данных кода объяснения

import ldap 

l = ldap.initialize("ldap://ldap.example.com") 
try: 
    l.protocol_version = ldap.VERSION3 
    l.set_option(ldap.OPT_REFERRALS, 0) 

    bind = l.simple_bind_s("[email protected]", "password") 

    base = "dc=example, dc=com" 
    criteria = "(&(objectClass=user)(sAMAccountName=username))" 
    attributes = ['displayName', 'company'] 
    result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes) 

    results = [entry for dn, entry in result if isinstance(entry, dict)] 
    print results 
finally: 
    l.unbind() 

Я не могу понять этот кусок кода здесь results = [entry for dn, entry in result if isinstance(entry, dict)]

  • Я не вижу dn, определенный в приведенном выше коде, поэтому откуда он берется?
  • Что делает isinstance(entry, dict)?

Когда я пытаюсь выполнить это, я вижу, что это возвращает список всех записей ldap со связанными с ним соответствующими атрибутами. Начальный result также возвращает список. Может кто-нибудь объяснить, что делает код results?

ответ

1
somelist = [entry for dn, entry in result if isinstance(entry, dict)] 
translates to 

for entry, dn in result: 
    if isinstance(entry, dict): # this checks if entry is of type dictionry 
     somelist.append(entry) 
+0

Спасибо. Разрывная версия помогла это понять. – pkill

1

Что вы видите, есть список по списку. Это конструкции, которые позволяют создавать последовательности из других последовательностей.

Причина, по которой вы не видите dn перед пониманием списка, поскольку она является заполнителем (аналогично item в цикле for item in list).

Я не специалист по пониманию, поэтому я включил некоторые ссылки, которые могут помочь вам пролить свет на этот вопрос.

Tutorial: List Comprehensions
Run down of syntax

+0

Спасибо. Ссылка помогает. – pkill

Смежные вопросы