함수를 호출할 때 매개 변수의 이름을 강제로 지정하려면 어떻게 해야 합니까?
파이썬에서 함수 정의는 다음과 같습니다.
def info(obj, spacing=10, collapse=1)
다음과 같은 방법으로 호출할 수 있습니다.
info(odbchelper)
info(odbchelper, 12)
info(odbchelper, collapse=0)
info(spacing=15, object=odbchelper)
Python은 이름만 있으면 어떤 순서의 인수도 허용합니다.
의 큰 중 에 따라 ▁between▁param▁the▁might▁grow▁be다것▁as▁adding니,입있▁functions▁problem▁people'▁we▁some는다▁is▁larger문▁ofre▁having제수▁our추 사이에 매개 변수를 추가할 수 있다는 것입니다.spacing
그리고.collapse
잘못된 값이 이름이 지정되지 않은 매개 변수로 이동할 수 있음을 의미합니다.게다가 때때로 무엇이 들어가야 하는지 항상 명확하지는 않습니다.
어떻게 하면 사람들이 특정 매개 변수의 이름을 지정하도록 강제할 수 있습니까? 단순한 코딩 표준이 아니라 이상적으로 플래그 또는 pydev 플러그인입니다.
따라서 위의 4가지 예제에서는 모든 매개 변수가 명명되므로 마지막 예제만 검사를 통과합니다.
3 - Python 3 - 예, 다을지수있다습을 할 수 .*
인수 목록에 있습니다.
문서에서:
"*" 또는 "*identifier" 뒤의 매개 변수는 키워드 전용 매개 변수이며 사용된 키워드 인수만 전달할 수 있습니다.
>>> def foo(pos, *, forcenamed):
... print(pos, forcenamed)
...
>>> foo(pos=10, forcenamed=20)
10 20
>>> foo(10, forcenamed=20)
10 20
>>> foo(10, 20)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 1 positional argument (2 given)
이는 또한 다음과 결합될 수 있습니다.**kwargs
:
def foo(pos, *, forcenamed, **kwargs):
예제를 완료하려면:
def foo(pos, *, forcenamed ):
print(pos, forcenamed)
foo(pos=10, forcenamed=20)
foo(10, forcenamed=20)
# basically you always have to give the value!
foo(10)
출력:
Traceback (most recent call last):
File "/Users/brando/anaconda3/envs/metalearning/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 3444, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-12-ab74191b3e9e>", line 7, in <module>
foo(10)
TypeError: foo() missing 1 required keyword-only argument: 'forcenamed'
그래서 당신은 항상 가치를 주어야 합니다.만약 당신이 그것을 부르지 않는다면 당신은 강요된 다른 이름의 논쟁을 할 필요가 없습니다.
다음과 같은 방법으로 함수를 정의하여 Python3에서 키워드 인수를 사용하도록 할 수 있습니다.
def foo(*, arg0="default0", arg1="default1", arg2="default2"):
pass
첫 번째 인수를 이름 없는 위치 인수로 함으로써 함수를 호출하는 모든 사람에게 당신이 질문한 키워드 인수를 사용하도록 강요합니다.Python2에서 이를 위한 유일한 방법은 다음과 같은 함수를 정의하는 것입니다.
def foo(**kwargs):
pass
그렇게 되면 전화를 건 사람이 억지로 궤짝을 사용하게 될 것입니다. 하지만 이것은 당신이 필요로 하는 주장만 받아들이도록 체크를 해야 하기 때문에 그렇게 좋은 해결책은 아닙니다.
대부분의 프로그래밍 언어는 매개 변수 순서를 함수 호출 계약의 일부로 사용하지만, 그럴 필요는 없습니다.왜 그럴까요?그렇다면 이 질문에 대한 저의 이해는 파이썬이 이 점에서 다른 프로그래밍 언어와 다른지 여부입니다.Python 2에 대한 다른 좋은 답변 외에도 다음을 고려해 주십시오.
__named_only_start = object()
def info(param1,param2,param3,_p=__named_only_start,spacing=10,collapse=1):
if _p is not __named_only_start:
raise TypeError("info() takes at most 3 positional arguments")
return str(param1+param2+param3) +"-"+ str(spacing) +"-"+ str(collapse)
가 인수를 할 수 은 호자가인제공할수방법유일입니다.spacing
그리고.collapse
예외 는 다음과 같습니다
info(arg1, arg2, arg3, module.__named_only_start, 11, 2)
다른 모듈에 속하는 개인 요소를 이미 사용하지 않는 관례는 Python에서 매우 기본적입니다.Python 자체와 마찬가지로 매개 변수에 대한 이 규칙은 반강제적으로만 적용됩니다.
그렇지 않은 경우 통화는 다음과 같은 형식이어야 합니다.
info(arg1, arg2, arg3, spacing=11, collapse=2)
통화
info(arg1, arg2, arg3, 11, 2)
는 매개 변수 값 11에 값 합니다._p
함수의 첫 번째 명령에 의해 발생한 예외.
특징:
- 이매개변 이전의
_p=__named_only_start
위치(또는 이름)로 승인됩니다. - 다매개변 뒤의
_p=__named_only_start
. ( 객체에 이 없는 ).__named_only_start
)을 획득하여 사용합니다.
찬성:
- 매개변수는 숫자와 의미가 명확합니다(물론 좋은 이름도 선택된 경우 나중에).
- 센티넬이 첫 번째 매개 변수로 지정된 경우 모든 인수를 이름으로 지정해야 합니다.
- 시 객체인 Sentinel 객체인 Sentinel을 수 .
__named_only_start
상응하는 위치에 - 다른 대안보다 더 나은 성과를 기대할 수 있습니다.
단점:
검사는 컴파일 시간이 아닌 런타임에 수행됩니다.- 인수는 아니지만 추가 매개 변수를 사용하고 추가 검사를 수행합니다.일반 기능과 관련하여 성능 저하가 적습니다.
- 기능은 언어가 직접 지원하지 않는 해킹입니다(아래 참고 참조).
- 시 객체인 Sentinel 객체인 Sentinel을 수 .
__named_only_start
바른 자세로네, 이것도 프로로 볼 수 있습니다.
이 답변은 Python 2에만 유효합니다.Python 3은 다른 답변에 설명된 유사하지만 매우 우아한 언어 지원 메커니즘을 구현합니다.
저는 제가 마음을 열고 그것에 대해 생각할 때, 어떤 질문이나 다른 사람의 결정도 어리석고 멍청하거나 그저 어리석어 보인다는 것을 발견했습니다.정반대입니다.저는 일반적으로 많은 것을 배웁니다.
Python 2와 Python 3 모두에서 작동하는 방식으로 "자연스럽게" 발생하지 않는 기본값으로 "bogus" 첫 번째 키워드 인수를 만들어 이 작업을 수행할 수 있습니다.해당 키워드 인수 앞에는 값이 없는 하나 이상의 인수가 있을 수 있습니다.
_dummy = object()
def info(object, _kw=_dummy, spacing=10, collapse=1):
if _kw is not _dummy:
raise TypeError("info() takes 1 positional argument but at least 2 were given")
이를 통해 가능한 작업:
info(odbchelper)
info(odbchelper, collapse=0)
info(spacing=15, object=odbchelper)
하지만 그렇지 않습니다.
info(odbchelper, 12)
기능을 다음으로 변경하는 경우:
def info(_kw=_dummy, spacing=10, collapse=1):
와 모든인는키와드워가 합니다.info(odbchelper)
더 이상 작동하지 않습니다.
를 이게하 키인다수배수있다 뒤에 할 수 ._kw
마지막 항목 뒤에 놓으라고 강요하지 않고 말입니다.이는 논리적으로 그룹화하거나 키워드를 알파벳 순으로 배열하는 것이 유지관리 및 개발에 도움이 될 수 있다는 것과 같은 의미가 있습니다.
따라서 다시 사용할 필요가 없습니다.def(**kwargs)
스마트 편집기에서 서명 정보가 손실됩니다.당신의 사회적 계약은 키워드를 요구하도록 강요함으로써 (그 중 일부는) 특정 정보를 제공하는 것인데, 키워드가 제시된 순서는 무의미해졌습니다.
인수python3 워키전인수용드인▁((수▁thepy용)*
를 사용하여 할 수 .x에서 시뮬레이션할 수 있습니다.**kwargs
다음과 같은 python3 코드를 생각해 보십시오.
def f(pos_arg, *, no_default, has_default='default'):
print(pos_arg, no_default, has_default)
그리고 그 행동:
>>> f(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 3 were given
>>> f(1, no_default='hi')
1 hi default
>>> f(1, no_default='hi', has_default='hello')
1 hi hello
>>> f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() missing 1 required keyword-only argument: 'no_default'
>>> f(1, no_default=1, wat='wat')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() got an unexpected keyword argument 'wat'
이 기능은 다음을 사용하여 시뮬레이션할 수 있습니다. 참고로 전환을 수행했습니다.TypeError
KeyError
argument"의것 .
def f(pos_arg, **kwargs):
no_default = kwargs.pop('no_default')
has_default = kwargs.pop('has_default', 'default')
if kwargs:
raise TypeError('unexpected keyword argument(s) {}'.format(', '.join(sorted(kwargs))))
print(pos_arg, no_default, has_default)
그리고 행동:
>>> f(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes exactly 1 argument (3 given)
>>> f(1, no_default='hi')
(1, 'hi', 'default')
>>> f(1, no_default='hi', has_default='hello')
(1, 'hi', 'hello')
>>> f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
KeyError: 'no_default'
>>> f(1, no_default=1, wat='wat')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in f
TypeError: unexpected keyword argument(s) wat
레시피는 python3.x에서도 동일하게 작동하지만 python3.x에서만 작동하는 경우에는 피해야 합니다.
업데이트:
저는 사용하는 것을 깨달았습니다.**kwargs
문제를 해결하지 못할 것입니다.프로그래머가 원하는 대로 함수 인수를 변경하면 예를 들어 함수를 다음과 같이 변경할 수 있습니다.
def info(foo, **kwargs):
그리고 이전 코드는 다시 깨질 것입니다(이제 모든 함수 호출은 첫 번째 인수를 포함해야 하기 때문입니다).
그것은 브라이언이 말하는 것으로 귀결됩니다.
이 (...) 사이에 (...) 도 있습니다.
spacing
그리고.collapse
(...)
일반적으로, 함수를 변경할 때, 새로운 인수는 항상 끝까지 가야 합니다.그렇지 않으면 코드가 깨집니다.분명해야 합니다.
만약 누군가가 코드가 깨지도록 기능을 변경한다면, 이 변경은 거부되어야 합니다.
처럼, (Bryan 말처계같습니다과약럼의))같)
(...) 때때로 무엇이 들어가야 하는지 항상 명확하지는 않습니다.
함의즉서명수즉((),def info(object, spacing=10, collapse=1)
) 기본값이 없는 모든 인수는 필수임을 즉시 확인해야 합니다.
인수의 목적은 문서 문자열에 포함되어야 합니다.
이전 답변(완전성을 위해 보관):
이것은 아마도 좋은 해결책이 아닐 것입니다.
기능은 다음과 같이 정의할 수 있습니다.
def info(**kwargs):
''' Some docstring here describing possible and mandatory arguments. '''
spacing = kwargs.get('spacing', 15)
obj = kwargs.get('object', None)
if not obj:
raise ValueError('object is needed')
kwargs
키워드 인수가 들어 있는 사전입니다.필수 인수가 있는지 확인하고 없으면 예외를 제기할 수 있습니다.
단점은 어떤 주장이 가능한지 더 이상 분명하지 않을 수도 있지만, 적절한 문서 문자열을 사용하면 괜찮을 것이라는 것입니다.
다른 답변에서 알 수 있듯이 기능 서명을 변경하는 것은 좋지 않은 생각입니다.끝에 새 매개 변수를 추가하거나 인수가 삽입된 경우 모든 호출자를 수정합니다.
그래도 이 작업을 수행하려면 함수 데코레이터와 inspect.getargspec 함수를 사용합니다.다음과 같은 방법으로 사용할 수 있습니다.
@require_named_args
def info(object, spacing=10, collapse=1):
....
『 』의 구현require_named_args
독자를 위한 연습으로 남겨집니다.
신경쓰지 않겠습니다.함수가 호출될 때마다 느려지고, 코드를 더 신중하게 작성하면 더 좋은 결과를 얻을 수 있습니다.
당신은 할 수 .**args
오직. 그렇게 하면 키워드 인수가 필요하지만 유효한 이름만 전달되도록 하기 위해 추가 작업이 필요합니다.
def foo(**args):
print args
foo(1,2) # Raises TypeError: foo() takes exactly 0 arguments (2 given)
foo(hello = 1, goodbye = 2) # Works fine.
당신은 사용할 수 있습니다.**
연산자:
def info(**kwargs):
이러한 방식으로 사람들은 명명된 매개 변수를 사용하도록 강요됩니다.
def cheeseshop(kind, *arguments, **keywords):
python에서 *args를 사용하면 이 매개 변수에 대한 n개의 위치 인수를 전달할 수 있습니다. 이 인수는 함수 내부의 튜플로 액세스됩니다.
그리고 키워드 인수를 의미하는 **kw를 사용하면 딕트로 액세스할 수 있습니다. n개의 인수를 전달할 수 있습니다. 그리고 해당 사용자가 시퀀스와 인수를 순서대로 입력해야 한다면 *와 **를 사용하지 마십시오. (큰 아키텍처를 위한 일반 솔루션을 제공하는 파이썬적인 방법은...)
기본값으로 기능을 제한하고 싶다면 내부를 확인할 수 있습니다.
def info(object, spacing, collapse)
spacing = 10 if spacing is None else spacing
collapse = 1 if collapse is None else collapse
애초에 프로그래머가 다른 두 가지 사이에 매개 변수를 추가하는 이유를 모르겠습니다.
함매변수를이함예과사경는려우하용께름개수예경:()과 사용하기를 :info(spacing=15, object=odbchelper)
그러면 어떤 순서로 정의되었는지는 중요하지 않으므로 새 매개 변수를 마지막에 놓는 것이 좋습니다.
만약 당신이 그 주문이 중요하기를 원한다면, 당신이 그것을 바꾼다면 어떤 것도 작동할 것이라고 기대할 수 없습니다!
언급URL : https://stackoverflow.com/questions/2965271/how-can-we-force-naming-of-parameters-when-calling-a-function
'source' 카테고리의 다른 글
'gitrebase'를 사용하여 이전 커밋 메시지 변경 (0) | 2023.07.08 |
---|---|
HTML 파일에 다른 HTML 파일 포함 (0) | 2023.07.08 |
빈 JavaScript 개체를 테스트하려면 어떻게 해야 합니까? (0) | 2023.07.08 |
MongoDB에서 초기 데이터를 로드하는 방법은 무엇입니까? (0) | 2023.07.08 |
엔티티 프레임워크가 ID 열을 삽입하도록 강제하려면 어떻게 해야 합니까? (0) | 2023.07.08 |