2015-06-23 2 views
0

Я работаю с библиотекой python и флягой.Изменение состояния и области действия в python

Я хотел бы, чтобы открыть страницу «example.com», а затем перейти по ссылке, чтобы открыть «example.com/linked_page.html»

Мой план заключается в использовании запроса сеансов, как это (упрощенный):

def main(): 
    s = requests.Session() 
    d = {'session':s, 'e': None} 

    html = get_base_page(d) 


def get_base_page(dict): 
    s = dict['session'] 
    html = s.get("example.com") 
    return html 

Поскольку состояние сеанса изменяется в пределах функции это повлияет на значение «с» в «основной» (?) глобальной области видимости. Также есть хорошее обсуждение этого в любом месте?

ответ

1

Функция get_base_page имеет свое собственное пространство имен, поэтому между двумя переменными s не будет никаких помех.

Вы можете получить доступ к глобальным переменным из функции get_base_page. Но если вы хотите присвоить им значение, вам необходимо объявить их как global. В противном случае они будут созданы в локальном пространстве имен функций, как это происходит в вашем случае.

См this статьи хорошего учебника о пространствах имен и сфере применения (LEGB правило)

Чтения своего вопроса еще раз, я думаю, что дело нам нужно выяснить, как объект s сохраняются как значение ключа с именем session в словаре d.

Теперь запустите питон и выполните следующие действия (>>> есть питон строка):

>>> s = 42 
>>> d = {'session': s, 'key2': 8} 
>>> d 
{'key2': 8, 'session': 42} 
>>> s = 3 
>>> d 
{'key2': 8, 'session': 42} 

Когда вы говорите s = 3, вы говорите питону, чтобы сделать точку s имени в/указать значение 3 , Вы не переписываете само значение.

Теперь давайте сделаем то же самое с родовым объектом класса мы определяем:

>>> class A(object): 
... def __init__(self, n): 
... self.n = n 
... 
>>> s = A(42) 
>>> d = {'session': s, 'key2': 8} 
>>> d['session'].n 
42 
>>> s.n = 30 
>>> d['session'].n 
30 

разницу? Имя s и ключ session указывают/указывают один и тот же экземпляр объекта. Поэтому, когда вы меняете свои атрибуты (достигая их через любое имя), это изменение повлияет на оба.

Обратитесь к статье this за неизменяемые/изменяемые объекты.

Практика со всеми типами python и посмотреть, что произойдет. Повеселись!

+0

Спасибо за объяснение! – user61629

1

Две переменные s не зависят друг от друга .... если вы не используете global s.

+0

Большое спасибо! – user61629