python - flake8 - e731 - Do not assign a lambda expression, use a def

2 분 소요

Intro - lambda function을 assign하지 말아라

  • 다음과 같은 매우 간단한 코드가 있습니다. lambda 함수를 변수에 할당해서 사용하죠.
func1 = lambda x: x * 10
  • 언뜻 보기에는 특별한 문제가 없는 것처럼 보이지만, 아래와 같이 코드를 사용할 경우 flake8에서 warnning을 하나 발생시키죠. 그 에러의 이름은 다음과 같습니다. “lambda 표현을 할당해서 사용하지 마세요”라는 것이죠.
do not assign a lambda expression, use a def flake8(E731)

Do not assign a lambda expression, use a def (E731)

  • flake8rules - E731의 공식문서를 보면,
    • lambda 함수를 변수에 할당할 경우, 디버깅할 때, 그 문제가 lambda에서 발생했다라고 알려준다.
    • 하지만, 함수로 정의해서 사용할 경우, 그 문제가 해당 함수의 이름에서 발생했다고 정확하게 알려준다.
  • 라는 차이가 있다고 하는데, 흠, 무슨 문제일지 정확하게 보도록 하죠.

lambda 함수에서 에러가 발생했을 때

  • 아래와 같이 간단한 코드가 있다고 하죠. 간단한 코드이며, 함수에 들어가서 Integer와 String간의 연산을 시킴으로 에러가 발생하게 됩니다.
func1 = lambda x: x + "ddd"
// Integer와 String을 연산시킴으로써 에러가 발생하는 코드.
func1(10)
  • 실행 결과를 보시면, in <lambda>라는 부분이 눈에 띕니다. 해당 구문은 함수이기는 하지만, 익명함수이기 때문에, func1이라는 이름을 가진 것이 아니고, 그냥 익명함수라고 인식되고 있는 것이죠.
  • 물론, 그래도 몇 번째 줄에서 에러가 발생했는지 알려주고 있기 때문에 디버깅을 하는데 큰 문제는 없습니다.
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    func1(10)
  File "test.py", line 5, in <lambda>
    func1 = lambda x: x + "ddd"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

function에서 에러가 발생했을 때

  • 아래와 같이, def 문을 통해서 함수를 만들고, integer와 String간의 연산을 처리해줍니다. 당연히 에러가 발생하는 구문이죠.
def func1(x):
    return x + "ddd"

func1(10)
  • 실행하면 다음과 같은 메세지가 발생합니다. 이전에서와 다르게 in func1이라고 함수의 이름이 명확하게 뜨는 것이 다른 점이죠.
  • 즉, 어떤 함수 내부에서 문제가 발생한 것인지를 매우 정확하게 알 수 있습니다.
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    func1(10)
  File "test.py", line 6, in func1
    return x + "ddd"
TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • 물론, 좀 미묘한 차이이기는 합니다만, 그래도 이렇게 해주는 게 좋다고 하니까 그렇게 하도록 하죠.

lambda function to def function

  • 따라서, 그럼 처음에 lambda로 만들었던 함수를 def를 통해 정식 함수로 변경해주도록 합시다.
  • 간단한 함수니까 두 줄로 만들지 않고, 한줄로 만들도록 합니다.
def func1(): return 10
  • 하지만, 이렇게 한 줄로 할 경우에는 다음과 같은 warning이 발생하게 됩니다. 이정도는 좀 봐줬으면 좋겠다는 생각이 드는데, 아무튼 좀 성가시군요.
Multiple statements on one line (def) flake8(E704)
  • 그리고, 가끔 docstring을 쓰라거나, 하는 귀찮은 일들도 발생하게 됩니다.

wrap-up

  • lambda 함수는 “익명함수”라는 이름으로 알려져 있습니다. 다르게 말하면, 한 번 쓰고 말 간단한 함수를 말하죠. 따라서, 한번 쓰고 말 함수를 굳이 특정 변수에 assign해주는 것 자체가 꽤나 이상한 동작이 되는 것이죠.
  • 다만, 그렇다면 그냥 lambda함수와 그냥 함수간의 차이를 두지 않으면 되었을텐데, 이 둘 간의 구분이 명확하게 되어 있어서 발생하는 문제인 것이죠.
  • 뭐, 결론적으로는 최대한 lambda함수의 사용을 지양하고, 2번 이상 쓸 것 같으면 정식함수로 만들어서 사용하는 것이 훨씬 낫다, 라는 이야기인 것 같네요.

reference

댓글남기기