**kwarg
와 *arg
같은 옵션으로 들어가는 파라미터는 무슨 파라미터인지 모르므로 이름으로 언급해주는 keyword argument를 써줘야한다positional argument인지 keyword argument인지 결정은 함수 혹은 매서드에서 파라미터를 넣을때
-> 이름넣고 =을 붙여 값을 대입하는가
-> 안붙이고 순서대로 값만 대입하는가
로 운명이 갈린다.
헷갈린부분
-> 원본함수에서 defualt value를 먼저 넣어줬다고 해서 무조건 keyargument가 아니다!
-> '=' 이 들어간다고 해서 무조건 keyword argument가 아니다!
code splitter 클래스를 만들던중 langchain의 from_language 매서드를 사용하려던 중
생성자 파라미터에는 분명히 chunk_size와 chunk_overlap의 default value들을 만들어 줘서 그대로 넣었는데 positional argument after keyword argument
에러가 난것이다.
여기서 보이는 chunk_size와 chunk_overlap은 **kwarg
로 optional한 argumentd이기 때문에 이름으로 무엇인지 지정해줘야하므로 keyword argument를 써줘야한다.
애초에 앞서 language 파라미터를 keyword parameter로 먼저 써줬기 때문에 나머지도 keyword parameter로 모두 바꾸거나
원래 매서드의 Poisitonal argument의 순서에 영향이 가지 않도록 하여 keyword parameter를 맨뒤로 빼주는 방법이 있다.
이런식으로 무조건 대입을 해줘야한다.
한계
그것이 바로 keyword argument이다.
def student_info(name, sex, age) :
print(f"""
이름 : {name}
성별 : {sex}
나이 : {age}
""")
>>> student_info("고길동", "남자", 50)
이름 : 고길동
성별 : 남자
나이 : 50
# 단점 : 순서를 잘못 알면 원하는 결과 값이 나오지 않음
>>> student_info("고길동", 50, "남자")
이름 : 고길동
성별 : 50
나이 : 남자
아래 예시처럼 원래는 def student_info(name, sex, age)
에서 파라미터 순서가 name, sex, age순서대로 대입을 해야하지만 (age = 50, name = "고길동", sex = "남자") 이런식으로 keyword argument를 사용하면 순서 상관없이 가능하다.
>>> student_info(age = 50, name = "고길동", sex = "남자")
이름 : 고길동
성별 : 남자
나이 : 50
결론: 혼합해서 사용하고 싶다면 positional argument 패거리들을 먼저 쓰고 keyword argument 패거리들을 써주면 되겠다.
다음과 같은 예시만 피하면 된다.
def student_info(name, sex, age= 1, hobby) :
print(f"""
이름 : {name}
성별 : {sex}
나이 : {age}
취미: {hobby}
""")
위와 같이 순서 상관 있는 hobby가 순서 상관없는 keyword argument인 age 뒤에 있다. 이렇게 된다면
syntaxerror가 뜬다.
저렇게 positional argument 패거리사이에 keyword argument패거리가 들어가버리면 순서가 상관 없어버리는 녀석이 순서가 상관있는 녀석 사이로 끼어들어가기 때문에
순서 상관있는 녀석 다음의 순서 상관있는 녀석들이 순서의 의미가 없어져버린다. 몇번째인지 정의가 되지 않는다는것
함수를 정의할 때 default 값 파라미터를 non-default 값 파라미터 앞에 선언하면 안된다. 아래와 같이 default 값 파라미터를 앞에 선언하면, SyntaxError가 뜨면서 함수가 선언되지 않습니다.
def student_info(age= 10, level) :
print(f"""
나이 : {age}
게임 레벨 : {level}
""")
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
왜냐하면 default 값 파라미터가 앞에 선언되어버리면, 이후에 함수를 호출할 때 입력한 특정 인자가 어떤 파라미터에 대입되는지 알 수 없기 때문입니다. default 값 파라미터 자체가 입력이 될 수도, 안될 수도 있는 값이기 때문에, 정확히 원하는 값을 반환하는데 어려움이 있습니다.
-> 저렇게 되면 함수선언할때 들어가는 argument가 어떤 파라미터에 대입되는지 모른다.
student_info(50)
위와 같은 코드에서 나이가 50인지 게임 레벨이 50인지 모른다