2010-06-21 2 views
8

У меня есть метод:Python: Любой способ объявить постоянные параметры?

def foo(bar): 
    # ... 

Есть ли способ пометить bar в качестве постоянного? Например, «Значение в bar не может быть изменено» или «Объект, на который указывает bar, не может измениться».

+0

Ссылки всегда 'const', но значения нет (вы не можете изменить, на что указывает' bar', но если 'bar' изменен, вы все равно можете изменить его значение). Конечно, это не правда, правда, так как вы можете использовать рамку стека ваших родителей и менять то, что указывает «бар», но при условии, что вы не прибегаете к такому хакерству, правило обычно применяется. –

+1

@NickBastin: Что? 'bar =" changed! "' - Я только что изменил, на что «bar» указывает «(которому присвоено правильное значение). –

+0

@EthanFurman: Не совсем. Я хочу сказать, что вы не можете изменить ссылки на «bar» в родительском стеке стека - вы можете, естественно, назначить имя «bar» локально, чтобы скрыть объект, в который вы были переданы, но этот объект все еще существует и остается неизменным в родитель. –

ответ

5

Если бар является неотъемлемым объектом, панель не будет меняться во время выполнения функции.

Вы также можете создать свой собственный постоянный объект. The recipie here.

+0

Обратите внимание, что перехватывающие изменения не решают проблему самостоятельно. Как вы знаете, что клиентский код не встретит ConstError? Только при достаточном тестировании. –

+0

'bar = 0' - Я только что сменил bar (исходный объект, которому был присвоен' bar', остается неизменным). –

-2

В чем дело? Если вы пишете эту функцию, не так ли до вы, чтобы убедиться, что bar не меняется? Или, если вы вызываете функцию, кого это волнует?

+0

Это часто полезно для политики - вы информируете пользователя об ограничении вашей функции. Конечно, это не имеет особого смысла в Python, поскольку нет прототипов, и нет никакого статического компилятора для принудительного ограничения. –

+7

Цель заключается в том, чтобы помочь программисту избежать ошибок, насколько это возможно. В противном случае мы все будем писать все в сборке. –

+0

@Jeremy Friesner: В Python «правильный» способ сделать это - просто написать комментарий. – carl

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