Wygląda na to, że wiele aspektów Pythona to tylko duplikaty funkcjonalności. Czy jest jakaś różnica poza redundancją, którą widzę w kwargs i dict w Pythonie?Jaka jest różnica między ** kwargs i dict w Pythonie 3.2?
Odpowiedz
Jest różnica w argumencie rozpakowaniu (gdzie wiele osób korzysta kwargs
) i przechodzącej dict
jako jeden z argumentów:
Korzystanie rozpakowywanie Argument:
# Prepare function def test(**kwargs): return kwargs # Invoke function >>> test(a=10, b=20) {'a':10,'b':20}
przechodzącą dict jako argument:
# Prepare function def test(my_dict): return my_dict # Invoke function >>> test(dict(a=10, b=20)) {'a':10,'b':20}
Różnice są głównie:
- czytelność (można po prostu przekazywać argumenty słów kluczowych, nawet jeśli nie zostały wyraźnie zdefiniowane),
- elastyczność (można obsługiwać kilka argumentów słów kluczowych jawnie, a reszta za pomocą
**kwargs
) , - argumentem rozpakowanie pomaga uniknąć nieoczekiwanych zmian w obiekcie „zawierający” argumentów (co jest mniej ważne, ponieważ Python w ogóle zakłada deweloperzy wiedzą, co robią, który jest inny temat),
Po rozpakowaniu klucze muszą być poprawnymi identyfikatorami –
@gnibbler: Masz rację, +1. Całkowicie tego nie zauważyłem. Jako przykład podam 'test ({0: 10, '0': 20})' (który zwróci '{0: 10, '0': 20}'), który jest trudny do zastąpienia rozpakowaniem argumentów. – Tadeck
Jest to słuszne, że w większości przypadków można po prostu wymieniać dykty i ** kwargs.
Na przykład:
my_dict = {'a': 5, 'b': 6}
def printer1(adict):
return adict
def printer2(**kwargs):
return kwargs
#evaluate:
>>> printer1(my_dict)
{'a': 5, 'b': 6}
>>> printer2(**my_dict)
{'a': 5, 'b': 6}
Jednak z kwargs masz większą elastyczność, jeśli połączyć je z innymi argumentami:
def printer3(a, b=0, **kwargs):
return a,b,kwargs
#evaluate
>>> printer3(**my_dict)
(5, 6, {})
- 1. Jaka jest różnica między metodami len() i sys.getsizeof() w pythonie?
- 2. Jaka jest różnica między "()" i "[]" podczas generowania w Pythonie?
- 3. Jaka jest różnica między plikami Pyc i Pyo w Pythonie?
- 4. Jaka jest różnica między% i% d w Pythonie?
- 5. Jaka jest różnica między modułami Unittest i unittest2 w Pythonie?
- 6. Jaka jest różnica między funkcjami json.load() i json.loads() w Pythonie?
- 7. Jaka jest różnica między int() i floor() w Pythonie 3?
- 8. Jaka jest różnica między? : i ||
- 9. Jaka jest różnica między $ i $$?
- 10. jaka jest różnica między dodawaniem i [] w operacjach słownikowych
- 11. Jaka jest różnica między = i: = w mysql?
- 12. Jaka jest różnica między! = I =! w Javie?
- 13. Jaka jest różnica między 'i "w PHP
- 14. Jaka jest różnica między! i !! w yaml?
- 15. jaka jest różnica między @ i @@ w module?
- 16. Jaka jest różnica między * i. * W Matlab?
- 17. Jaka jest różnica między | i || w MATLAB?
- 18. Jaka jest różnica między * i * | * w CSS?
- 19. Jaka jest różnica między literałem a zmiennymi w Pythonie?
- 20. Efektywność i klucz w dict w Pythonie
- 21. Objective-C: Jaka jest różnica między forKey i forKeyPath?
- 22. Jaka jest różnica między modułem a skryptem w Pythonie?
- 23. różnica między dict (GroupBy) i GroupBy
- 24. Różnica między importem i __import__ w Pythonie
- 25. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 26. Jaka jest różnica między asersem i static_assert?
- 27. Jaka jest różnica między PropertyChangeListener i VetoableChangeListener?
- 28. Jaka jest różnica między Ja i Ja?
- 29. Jaka jest różnica między ATL i WTL?
- 30. Jaka jest różnica między FontMetrics.stringWidth() i FontMetrics.getStringBounds()?
'** kwargs' niejawnie tworzy * A *' dict' obiekt (nazwane przez 'kwargs') załadowane kluczami i wartościami. To nie jest powielona funkcjonalność. –
Rozwiń "wiele aspektów". Jakie inne obszary to duplikat funkcjonalności? – jdi