흔한말 (collection)/Dynamo

파이썬과 다이나모 문자열 형식화

hnanmal 2022. 6. 21. 12:52
300x250

프로그램이 연산한 결과를 보기 좋게 문자열로 포장해서 출력하는 방식은 중요합니다.

파이썬에서 문자열을 형식화하는 방법은 여러 가지가 있는데, 그중에서 가장 사용하기 편리한 방식은 f-string 방식이라고 합니다. 들어보신 분도 있을 거고 못 들어보신 분도 있을 텐데, 중요한 것은 이게 참 쉽고 편한 방식이라는 겁니다.

그런데 다이나모에서 문자열을 형식화 하고 싶으면 어떻게 하면 될까요?

되긴 되지만 조금은 돌아서 가는 방법이라 갑갑한 측면이 있습니다.

 

 

 

다이나모에서의 문자열 형식화

 

에를 들어서 보여드리자면 이런 식입니다. 핵심은 String.Replace 노드이긴 한데, 파이썬이나 다른 프로그래밍 언어에서 가능한 방식의 문자열 형식화를 다이나모에서 구현하려면 꽤나 골치를 썩여야 합니다. 엄청 복잡하죠? 동일한 기능을 구현하려면 저렇게나 복잡하게 노드를 짜두어야 합니다. 노드를 세어보니 입력부를 제외하고 27개의 노드를 꺼냈군요;;

 

제가 만든 샘플 코드는 숫자 두 개를 형식화할 문자열에 대입해서 최종적으로는

 

“{n}번째 벽체의 면적은 {xxx} m2 입니다. {첫번째인사말}. {두번째인사말} ”

이라는 형식의 문자열로 만들어내는 코드입니다.

 

코드를 보시면 아시겠지만, 서식 기호(’%’)의 문자열 내부 인덱스를 파악하고, 서식 기호 단위로 문자열을 분할한 뒤에, 삽입 대상 문자열을 순서대로 서식 기호의 위치에 치환시킨 다음에 문자열을 재조립하는 흐름으로 되어 있습니다.

 

만들면서도 무슨 짓인가 싶었는데, 다 만들고 보니 재미는 있었지만 결국 바퀴를 다시 발명한 꼴이 되었네요.

 

혹시나 재미 삼아 보실 분을 위해 파일은 아래에 첨부해 두겠습니다.

다이나모_문자열형식화 구현.dyn
0.06MB

 

파이썬에서의 f-string

그에 비해 파이썬에서의 문자열 형식화 방법 중의 하나인 f-string은 사용법이 굉장히 간단합니다.

 

다이나모에 비하면 허무할 정도로 코드가 간단하죠?

 

f-string의 형식은 쉽습니다.

f"문자열 중간에 {변수명}의 형태로 작성하면 됩니다."

문자열 형식화는 기존에 존재하는 어떤 문자열의 내부에 특정 변수에 할당된 값을 포함하여 새로운 문자열을 만들어 주는 것입니다.

 

파이썬에서 f-string방식으로 문자열 형식화를 하려면, 위의 문구처럼 일단

  1. 따옴표를 이용해서 문자열을 작성한 뒤에
  2. 내부에 변수값을 위치시킬 부분에 { } 중괄호를 이용해서 표시해두고
  3. 마지막으로는 문자열 시작 따옴표 앞에 f를 입력하면 됩니다.

 

다이나모 예제와 똑같은 문자열도 한번 만들어 볼까요?

 

쉽죠? 참고로 문자열 시작 따옴표 앞에 f를 붙여주지 않으면 아래와 같이 결과가 나오니 주의하세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

다이나모에서 파이썬 f-string 이용하기

다이나모에서도 기본 노드를 이용해 마뜩잖게 구현한 문자열 형식화를 쓰는 대신에, 파이썬의 f-string을 쓸 수 있습니다. Python Script 노드를 이용하면 되죠.

 

그래서 이번에는 레빗 샘플 프로젝트를 열고, 다이나모 내부에서 모든 벽체를 선택한 뒤에, 벽체 별로 벽체의 번호와 면적을 문자열로 반환해주는 코드를 한번 짜 보겠습니다.

 

 

먼저 위 그림처럼 샘플 프로젝트 파일을 열고, Categories노드와 All Elements of Category노드를 이용해 프로젝트에 존재하는 모든 벽체들을 다이나모로 소환해 주겠습니다.

 

우리한테 필요한 정보는 벽체의 순서 번호와 각 벽체의 면적이죠?

 

이렇게 벽체의 번호와 그 벽체의 면적이 하나로 묶인 데이터 쌍을 준비해 줍니다.

 

그다음에는 데이터 쌍의 옆에 Python Script 노드를 하나 꺼내 준 뒤에 두 노드를 연결해 줍니다.

그리고 오른쪽 검은 화면에 있는 대로 코드를 한번 작성해 보실까요?

dataSets = IN[0]

result = []

for x in dataSets:
    벽번호 = x[0]
    벽면적 = x[1]
    첫번째인사말 = "감사합니다"
    두번째인사말 = "그럼 이만"

    파이썬으로_fstring_만들기 = f"우선, {벽번호}번째 벽체의 면적은 {벽면적}m2 입니다. {첫번째인사말}. {두번째인사말}."

    result.append(파이썬으로_fstring_만들기)

OUT = result

필요한 코드를 복사해서 붙여 넣어서 실습해 보세요.

 

코드를 실행하면 맨 오른쪽 Watch 노드에서 볼 수 있듯이, 벽체 별 번호와 면적이 문자열 형식화되어서 보기 좋은 글귀로 반환된 것을 볼 수 있습니다.!!!

 

다이나모에서 문자열 형식화를 해야 할 일이 있다면, 특별한 이유가 없다면 Python Script 노드로 처리하는 것을 추천드립니다. 처리할 때마다 노드를 27개씩 꺼낼 수는 없잖아요?

반응형