Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parametry z wartością domyślną, która nie jest read-only #2

Open
cameel opened this issue May 9, 2018 · 7 comments
Open

Parametry z wartością domyślną, która nie jest read-only #2

cameel opened this issue May 9, 2018 · 7 comments
Assignees
Labels
coding style python ready to implement When discussion is finished this label is given to indicate, that issues is ready for implementation

Comments

@cameel
Copy link
Member

cameel commented May 9, 2018

Moim zdaniem powinniśmy zabronić tego w Coding Style i dodać wyjaśnienie dlaczego. Moja wstępna propozycja:

  • Unikamy nadawania parametrom funkcji wartości domyślnych, które są obiektami, które da się zmodyfikować. W szczególności chodzi o wartości takie jak [],{}. Zamiast tego nadajemy im wartość None i wewnątrz funkcji nadajemy już docelową wartość domyślną..
    • Przykład:
      def myfunc(value=None):
          if value is None:
              value = []
          # modify value here
    • Przyczyną jest to, że wartość domyślna jest wyliczana tylko raz, w momencie definiowania funkcji i wszystkie zmiany dokonane w niej przez funkcję zachowują się między wywołaniami, co zwykle jest niepożądanym i nieintuicyjnym zachowaniem.
    • Nie ma tego problemu z wartościami prostymi jak liczby, wartości logiczne, stringi. One są niemodyfikowalne - ich "modyfikacja" zawsze powoduje utworzenie w pamięci nowego obiektu, a nie zmodifykowanie istniejącego.
    • Więcej na ten temat: Default Parameter Values in Python.

Jeżeli ktoś chciałby to przeformułować, rozszerzyć albo dodać przykłady, proszę o propozycje w komentarzach.

@rwrzesien
Copy link

👍

@dybi
Copy link

dybi commented May 10, 2018

@cameel, bardzo dobry pomysł. Dorzuciłbym przykład z linka:

def myfunc(value=None):
    if value is None:
        value = []
    # modify value here

bo jak znam życie, to co druga osoba nie kliknie/nie przeczyta ;)

Oprócz tego, myślę, że warto byłoby napisać o NIE nadawaniu wartości domyślnych wszystkim argumentom w funkcjach. W kodzie mamy sporo funkcji typu:

def weird_fun(param1=None, param2=None):
    assert param1 is not None
    assert isinstance(param2, str)
   # some code 

@cameel
Copy link
Member Author

cameel commented May 10, 2018

OK.

Co do nadużywania wartości domyślnych to też zupełnie się zgadzam. Ale może zaproponuj konkretne sformułowanie dla tej zasady w osobnym issue.

@dybi
Copy link

dybi commented May 10, 2018

zrobiłem issue: #4

@Jakub89
Copy link

Jakub89 commented May 21, 2018

👍

@dybi
Copy link

dybi commented Jun 12, 2018

To też chyba można już śmiało dodać ;)

@dybi
Copy link

dybi commented Jun 12, 2018

@cameel, zmodyfikowałem Twojego posta - dodałęm do niego przykład z linka

@dybi dybi added the ready to implement When discussion is finished this label is given to indicate, that issues is ready for implementation label Jun 12, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
coding style python ready to implement When discussion is finished this label is given to indicate, that issues is ready for implementation
Projects
None yet
Development

No branches or pull requests

4 participants