Как можно создать новые области в Python - PullRequest
16 голосов
/ 12 февраля 2009

Во многих языках (и местах) есть хорошая практика создания локальных областей, создавая блок, подобный this .

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

Как я могу реализовать это в Python без получения неожиданной ошибки отступа и без использования какого-либо если True: трюки

Ответы [ 9 ]

8 голосов
/ 12 февраля 2009

Почему вы все равно хотите создавать новые области в python?

Обычная причина сделать это на других языках - переменная область видимости, но в python этого не происходит.

if True:
    a = 10

print a
6 голосов
/ 12 февраля 2009

В Python область видимости бывает трех типов: глобальная, локальная и классовая. Вы можете создать специализированные словари 'scope' для передачи в exec / eval (). Кроме того, вы можете использовать вложенные области (определение функции внутри другой). Я обнаружил, что этого достаточно во всем моем коде.

Как уже сказал Дуглас Лидер, основной причиной использования его в других языках является переменная область видимости, а в Python этого не происходит. Кроме того, Python - самый читаемый язык, который я когда-либо использовал. Это пошло бы на грань читабельности, чтобы сделать что-то вроде трюков if-true (которых вы говорите, что хотите избежать). В этом случае, я думаю, лучше всего реорганизовать ваш код в несколько функций или использовать одну область видимости. Я думаю, что доступных областей в Python достаточно, чтобы охватить все возможности, поэтому локальная область не должна быть необходимой.

Надеюсь, это поможет.

2 голосов
/ 12 февраля 2009

Python имеет ровно две области: локальную и глобальную. Переменные, которые используются в функции, находятся в локальной области независимо от того, на каком уровне отступа они были созданы. Вызов вложенной функции будет иметь эффект, который вы ищете.

def foo():
  a = 1

  def bar():
    b = 2
    print a, b #will print "1 2"

  bar()

Тем не менее, как и все, я должен спросить вас, почему вы хотите создать ограниченную область видимости внутри функции.

2 голосов
/ 12 февраля 2009

A scope - текстовая область Программа Python, где пространство имен прямо доступны. «Непосредственно доступно »означает, что безусловная ссылка на имя пытается найти имя в Пространство имен ...

Пожалуйста, прочитайте документацию и уточните свой вопрос.

Кстати, вам не нужно if(TRUE){} в C, достаточно простого {}.

2 голосов
/ 12 февраля 2009

Если вы просто хотите создать временные переменные и разрешить их сборку мусора сразу после их использования, вы можете использовать

del varname

когда ты больше не хочешь их.

Если это только для эстетики, вы можете использовать комментарии или дополнительные символы новой строки, но без лишних отступов.

2 голосов
/ 12 февраля 2009

Я бы воспринял это как явный признак того, что пришло время создать новую функцию и выполнить рефакторинг кода. Я не вижу причин для создания такой новой области видимости. Любая причина в виду?

2 голосов
/ 12 февраля 2009

переменные в понимании списка (Python 3+) и генераторы являются локальными:

>>> i = 0
>>> [i+1 for i in range(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> i
0

но зачем вам это нужно?

1 голос
/ 12 февраля 2009
def a():
    def b():
        pass
    b()

Если я просто захочу дополнительного отступа или отлаживаю, я буду использовать if True:

0 голосов
/ 24 мая 2016

обновление

Этот ответ неверный. with оператор не ограничивает область действия; он позволяет выполнять очистку только при выходе из области (хотя вы можете сделать исключение при броске объекта после того, как к нему обратились после выхода).


В зависимости от вашего случая, вы можете with выписка :

with Cat() as cat, Cake() as cake:
    cat.eat(cake)

эквивалентно

# scope begin
cat = Cat()
cake = Cake()
cat.eat(cake)
# scope end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...