2010-06-21 15 views
8

Mam metodę:Python: Dowolny sposób deklarowania stałych parametrów?

def foo(bar): 
    # ... 

Czy istnieje sposób, aby oznaczyć bar jako stałą? Takich jak "Wartość w bar nie może się zmienić" lub "Obiekt wskazany przez bar nie może się zmienić".

+0

Odwołania są zawsze "const", ale wartości nie są (nie można zmienić tego, na co wskazuje 'bar', ale jeśli' bar' jest zmienne, wciąż można zmienić jego wartość). Oczywiście nie jest to * tak naprawdę * prawdą, ponieważ możesz zrobić z ramą stosu twoich rodziców i zmienić to, co wskazuje 'bar', ale zakładając, że nie uciekasz się do takiego hakera, reguła ogólnie obowiązuje. –

+1

@NickBastin: Wha? 'bar =" zmieniono! "' - Właśnie zmieniłem co 'bar' 'wskazuje' na (jest przypisane, aby było poprawne). –

+0

@EthanFurman: Niezupełnie. Chodzi mi o to, że nie można zmienić referencji 'bar' w ramce stosu rodzica - można oczywiście przypisać nazwę' bar' lokalnie, aby ukryć obiekt, który został przekazany, ale ten obiekt nadal istnieje i pozostaje niezmieniony w rodzic. –

Odpowiedz

5

Jeśli słupek jest obiektem nieumiejętnym, pasek nie zmieni się podczas działania.

Można również utworzyć własny stały obiekt. The recipie here.

+0

Pamiętaj, że przechwytywanie modyfikacji nie rozwiązuje problemu samodzielnie. Skąd wiadomo, że kod klienta nie napotka na błąd ConstError? Tylko przy wystarczających testach. –

+0

'bar = 0' - Właśnie zmieniłem pasek (oryginalny obiekt, do którego przypisano' bar', pozostaje niezmieniony). –

-2

Nr

O co ci chodzi? Jeśli piszesz tę funkcję, czy to nie jest ty, aby upewnić się, że bar się nie zmienia? Lub jeśli dzwonisz do funkcji, kogo to obchodzi?

+0

Często jest to przydatna kwestia polityki - informujesz użytkownika o ograniczeniu funkcji. Oczywiście nie ma to większego sensu w Pythonie, ponieważ nie ma prototypów, a także nie ma statycznego kompilatora, który wymusiłby ograniczenie. –

+7

Chodzi o to, aby pomóc programistom uniknąć błędów, o ile to możliwe. W przeciwnym razie wszyscy zapisalibyśmy wszystko w zespole. –

+0

@Jeremy Friesner: W Pythonie "właściwym" sposobem na zrobienie tego jest napisanie komentarza. – carl