Python에서 *args는 무엇입니까?

4986 단어 pythonfunctional
우리는 모두 클래스의 함수나 메서드를 호출한 다음 편집기에서 다음과 같은 내용을 표시하는 것을 봅니다.



초점은 그림의 *values 부분에 있습니다.

대부분의 경우, 우리는 단지 그것을 사용하고 우리의 길을 갑니다.

이 게시물에서는 별표 항목(보통 *args 이라고 함)의 목적과 이를 사용하여 지루함을 없애고 Python 함수 및 메서드의 긴장을 줄이는 방법을 살펴보겠습니다.

문제



Isaac 기억하시나요? 글쎄, 그는 여기에 문제가 있습니다.

Isaac은 Genghis Khan 중 하나인 greatest men the world will ever see에 고용되어 적의 목숨을 끊는 프로세스를 자동화했습니다.

이것은 Isaac의 두 번째 중요한 작업이며 그는 몽골 제국의 황제에게 깊은 인상을 줄 준비가 되어 있으므로 사람들의 이름 목록을 수락한 다음 필요한 작업을 수행하여 오염을 줄이는 기능dispatch_foe을 만듭니다.

그는 다음과 같은 함수를 휘젓습니다.

from GenghisKhan.actions import kill

def dispatch_foe(name: str) -> bool:
    success: bool = kill(name) # ends the life

    return success


문제



많은 사람들에게 이 함수를 호출하려면 다음과 같이 해야 합니다.

for name in list_of_names:
    dispatch_foe(name)


이것은 관련된 병사들에게 상당히 힘들 수 있으며 그들에게만 더러운 일을 합니다. 실제로 많은 것을 자동화하지는 않습니다.

작은 솔루션



글쎄, Isaac은 그의 기능이 이름 목록을 받아들이고 나머지를 수행하도록 결정합니다.

from typing import List
from GenghisKhan.actions import kill

def dispatch_foe(names: List) -> bool:
    success: bool = True
    for name in names:
        success = success and kill(name) # tells us if and only if everyone died

    return success


다음과 같이 dispatch_foe를 호출할 수 있습니다.

# people who we both share mutual hate
enemies = ["Erons", "Victor Aiyeola", "Davidemi"]

# test to confirm that they were successfully dispatched
assert True is dispatch_foe(enemies)


실제 솔루션(이유)



Isaac의 솔루션은 효과가 있지만 어리석습니다. 왜요? 단순히 우리가 그것을 받아들이면 *args가 무엇을 하는지 가르쳐 줄 수 없기 때문입니다. 즉, 수명이 다할 때까지 완전한 무지에 빠져들게 될 것입니다.

이것은 위험한 영향을 미칩니다. 누군가의 생명이 *args에 의해서만 구원받을 수 있는 경우, 우리가 이삭의 대답을 거부하는 것은 세계 기아를 해결하는 핵심 영혼이 될 수 있는 그 사람의 종말을 의미하며, 따라서 수백만, 수십억의 죽음을 초래할 것입니다. 이것이 우리가 어떤 문제를 해결하기 위한 이삭의 첫 번째 해결책을 항상 거부해야 하는 이유입니다.

사실...ㅋㅋㅋㅋ

대부분의 경우 함수가 기본값을 지정하지 않고 가변 개수의 인수를 허용하기를 원할 것입니다. *args는 이를 수행하는 아름답고 파이썬적인 방법입니다.

그래서 우리는 그것을 목록이나 튜플이나 사전(아, 이것에 대한 트릭이 있습니다. 언젠가 그것에 대한 기사를 쓸 것입니다)이나 세트, 배열, 벡터, 연결 목록 또는 이중 연결 목록이나 삼중 연결 목록 대신 사용할 것입니다. 또는 4중 연결 목록 또는 ...

실제 솔루션(설명이 첨부되지 않은 실제 항목)



따라서 우리는 병사들이 목록에 적지 않고 가능한 한 많은 적을 지나갈 수 있도록 Isaac의 솔루션을 재작업할 것입니다.

from typing import Sequence
from GenghisKhan.actions import kill

def dispatch_foe(*names: Sequence[str]) -> bool:
    success: bool = True
    for name in names:
        success = success and kill(name) # tells us if and only if everyone died

    return success


다음과 같이 다양한 방식으로 함수를 호출할 수 있습니다.

# 'do' Erons alone
assert True is dispatch_foe("Erons")

# 'do' Erons and someone else
assert True is dispatch_foe("Erons", "Someone else")

# 'do' people who hate me
assert True is dispatch_foe("Erons", "Davidemi", "Victor Aiyeola")




그리고 작은 필멸의 존재, 이삭의 문제에 대한 우아한 해결책이 있습니다. 징기스칸은 적의 문제를 해결하기 위해 이삭의 해결책을 사용했습니다. 안타깝게도 이삭의 이름은 역사책에 없습니다. 예, 일부 조직과 일부 성공적인 제품은 엔지니어에게 충분한 칭찬을 제공하지 않기 때문입니다.

'*' 문자는 PEP448에 의해 도입되었으며 일반적으로 반복 가능한 압축 풀기 연산자라고 합니다.

또한


 and

 ```**kwargs```

 (we'll learn this later) can make debugging quite evil. So you'd want to watch your back whilst using them.

## Disclaimer
There is no `GenghisKhan` module implemented anywhere in the Python standard library or Pypi index or anywhere. No murders were committed in the course of this code and my *enemies* are excellent engineers with happy jobs (I don't have one, so I don't like them at all).

Also, there is no proof that Genghis Khan actually asked Isaac to write this function. I must have written this article while dreaming.

## The actual end
May the force of the snaky language dwell richly in your soul and may you find what is that good, pleasing and perfect will of The One Above All.

좋은 웹페이지 즐겨찾기