[Python] 내장함수 getattr()를 활용해 코드 간소화 시키기

 

[Python] 내장함수 getattr()를 활용해 코드 간소화 시키기

getattr()의 기능 getattr(object, 'name') 이라는 함수는 object라는 오브젝트 내부의 name이라...

blog.naver.com

python에서 getattr함수를 이용하면 위의 링크에서 설명해주고 있는 것처럼 method의 이름을 string으로 호출할 수 있게 된다.

이런 기능은 함수 포인트를 사용하는 것처럼 코드를 깔끔하게 만들 수 있는데 사용될 수 있다고 생각되어 유용하게 활용될 수 있겠다.

그런데 정작 getattr 함수를 찾았던 내용과는 또 달라서 더 찾아봐야했다.

  label_type = getattr(processor, "label_type", None)
  is_regression = getattr(processor, "is_regression", False)
  has_sample_weights = getattr(processor, "weight_key", False)

위와 같은 코드였는데 세 항목은 모두 함수가 아니었다. 위의 두 개는 class에 정의된 변수였고, 마지막 string은 선언한 class에서 정의되지 않은 문자열이었다.

추측하기로는 class의 내부 변수로 세 번째 값을 설정하고 그 값을 다시 반환하는게 아닐까? 하고 추측을 했지만 자신할 수가 없어서 더 찾아 보았다.

Python getattr()

 

Python getattr()

Python getattr() The getattr() method returns the value of the named attribute of an object. If not found, it returns the default value provided to the function. The syntax of getattr() method is: getattr(object, name[, default]) The above syntax is equiva

www.programiz.com

이 사이트에서 찾을 수 있었는데 class에서 정의되지 않은 변수의 경우 오류 메시지가 반환되는데 이때 오류를 발생하지 않고 반환값의 default 값을 지정해주는데 사용된다고 한다.

default (Optional) - value that is returned when the named attribute is not found

찾고 보니 아 이게 있으면 코드가 더 깔끔하곘다 싶다.

강제로 값을 할당하는 것보다 기존의 인스턴스의 값도 바꾸지 않으니 더 유용할 것 같고..

reference를 찾아보는게 더 필요하구나 싶다.

'개발' 카테고리의 다른 글

Abseil Python Common Libraries  (0) 2021.05.07
docker를 이용한 tensorflow 2.x 개발환경 설정  (0) 2021.05.04
pdf2docx를 이용한 pdf 변환 코드  (0) 2021.04.30
eclipse encoding 변경  (0) 2014.08.20
[펌] 언어학 관련 원어 해석  (0) 2011.05.17

abseil/abseil-py

 

abseil/abseil-py

Abseil Common Libraries (Python). Contribute to abseil/abseil-py development by creating an account on GitHub.

github.com

absl-py

 

absl-py

Abseil Python Common Libraries, see https://github.com/abseil/abseil-py.

pypi.org

 

기본 사용 방법

from absl import app
from absl import flags

FLAGS = flags.FLAGS
flags.DEFINE_string("name", None, "Your name.")
flags.DEFINE_integer("num_times", 1,
                     "Number of times to print greeting.")

# Required flag.
flags.mark_flag_as_required("name")

def main(argv):
  del argv  # Unused.
  for i in range(0, FLAGS.num_times):
    print('Hello, %s!' % FLAGS.name)


if __name__ == '__main__':
  app.run(main)

django 등에서 봤던 프로그래밍 방식을 지원하는 라이브러리로 보인다.

매개변수나 필수 항목, 기본 값, USAGE 출력 등을 미리 처리해주기 때문에 기본적인 스크립트를 작성할 때 간단한 코드로 귀찮은 작업들을 대신해준다.

위와 같은 간단한 코드로 아래와 같은 결과를 얻을 수 있다.

  • python adsl_test.py

  • python adsl_test.py
  • python adsl_test.py --name=TEST
  • python adsl\_test.py --help

Logging

  • 로그를 남기는데 사용되는 함수 형태

abseil / Logging

 

abseil / Logging

An open-source collection of core C++ library code

abseil.io

from absl import app
from absl import flags
from absl import logging

FLAGS = flags.FLAGS
flags.DEFINE_string("name", None, "Your name.")
flags.DEFINE_integer("num_times", 1,
                     "Number of times to print greeting.")

# Required flag.
flags.mark_flag_as_required("name")

def main(argv):
    del argv  # Unused.
    for i in range(0, FLAGS.num_times):
        print('Hello, %s!' % FLAGS.name)
    logging.info("test %s" % FLAGS.name)
    logging.info('Interesting Stuff')
    logging.info('Interesting Stuff with Arguments: %d', 42)

    logging.set_verbosity(logging.INFO)
    logging.log(logging.DEBUG, 'This will *not* be printed')
    logging.set_verbosity(logging.DEBUG)
    logging.log(logging.DEBUG, 'This will be printed')

    logging.warning('Worrying Stuff')
    logging.error('Alarming Stuff')
    logging.fatal('AAAAHHHHH!!!!')  # Process exits

if __name__ == '__main__':
  app.run(main)
  • 위의 코드에 대한 출력 결과

'개발' 카테고리의 다른 글

[python] getattr 함수  (0) 2021.05.10
docker를 이용한 tensorflow 2.x 개발환경 설정  (0) 2021.05.04
pdf2docx를 이용한 pdf 변환 코드  (0) 2021.04.30
eclipse encoding 변경  (0) 2014.08.20
[펌] 언어학 관련 원어 해석  (0) 2011.05.17

개발 환경을 docker에서 설정하는게 맞는지는 모르겠다. 그래도 자꾸만 환경이 바뀌어서 예전 코드가 동작하지 않는 등의 문제에 대응하기 위해서  개발용 이미지, 수행용 이미지를 만들어 보관하는 것이 하나의 대안이 될 수도 있을 듯 하다. 

다만 project하나마다 수십기가의 백업이 있어야 하는지는 좀 고민스럽긴 하다. 

image download

docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash

  • 이 명령을 통해서 tensorflow-gpu가 인식되는 버전을 다운로드 받고 실행을 확인함
  • bash 안에서 nvidia-smi를 실행하면 docker의 host에서 설정한 nvidia driver가 잡혀있는 것을 확인할 수 있고, nvidia-smi를 통해 GPU도 동작하는 것을 확인함.

개발 환경 설정

  • 받아진 이미지는 단순하게 python과 tensorflow만 설정된 상태의 docker이기 때문에 개발을 위해서는 container에 관련 환경 설정을 해줘야 함.
  • 아래의 명령들로 기본적인 툴 들을 설치 함apt install net-tools apt install openssh-server apt-get install vim apt-get install git
  • docker는 실행하고 바로 내려가기 때문에 bash와 연계되어 내려가지 않도록 하고, ssh로 접근할 수 있도록 데몬을 띄워주는 script를 작성 : /run/run.sh#!/bin/bash /usr/sbin/sshd /bin/bash
  • 여기까지 만들어진 container를 image로 생성하여 향후 다양한 project에서 사용될 수 있도록 commit 함
    • 기존에 떠 있던 container를 stop 하고 CONTAINER ID를 확인
      • docker stop <container_name>
      • docker ps -a
    • image로 commit
      • docker commit -a 'lazgob' <container ID> <image name>
  • 이미지로부터 run.sh를 실행하여 개발환경을 시작함 이때 ssh로 접속할 수 있도록 port도 처리하고 향후 사용을 위해 이름도 정의
    • docker run -p 2222:22 --name classifysent --gpus all -it <image name> /run/run.sh
  • 다른 서버에서도 사용할 수 있도록 image를 저장하고 image에 등록 하는 방법
    • 저장: docker image save -o 압축이름.tar 이미지이름
    • 등록: docker load < 압축이름.tar

'개발' 카테고리의 다른 글

[python] getattr 함수  (0) 2021.05.10
Abseil Python Common Libraries  (0) 2021.05.07
pdf2docx를 이용한 pdf 변환 코드  (0) 2021.04.30
eclipse encoding 변경  (0) 2014.08.20
[펌] 언어학 관련 원어 해석  (0) 2011.05.17

웹에서 다양한 자료들을 crawling해서 정리할 때 pdf로 된 경우 복사, 붙여넣기가 너무 힘들어서 시간이 오래걸리는 문제가 있다.

이런 번거로움을 줄이기 위해서 검색을 하다보니 pdf를 word문서인 docx로 변환하는 python library가 있었다.

그 것을 이용해서 간단하게 코드를 짜서 정리하니 표로 정리된 부분이 훨씬 수월하게 복사가 되어 조금은 편해졌다.

from pdf2docx import Converter
import sys
import re


if len(sys.argv)== 1:
    print ("USAGE: %s file.pdf", sys.argv[0])
print (sys.argv)

pdf_file = sys.argv[1]
docx_file = re.sub(".pdf", ".docx", pdf_file, flags=re.I)

# convert pdf to docx
cv = Converter(pdf_file)
cv.convert(docx_file, start=0, end=None)
cv.close()

 

출처는... 잘 모르겠음..

해라체 plane formal style
하게체 familiar formal style
해체 plane informal style
하오체 authoritative formal style
합쇼체 polite formal style
해요체 polite informal style

평서문 declarative sentence
의문문 interrogative sentence
명령문 imperative sentence
감탄문 exclamatory sentence
청유문 propositive sentence

어미 ending
어말어미 final ending
선어말어미 prefinal ending

양성모음 bright vowel 
음성모음 dark vowel

모음조화 vowel harmony
모음축약 vowel contraction
모음탈락 vowel omission

태              voice ; 사동, 피동
서상            aspect ; 시발, 계속, 중지, 종료, 반복 등
시제            tense ; 과거, 현재, 미래 등
법성            modality (mood) 
서법            mood
                직설법       indicative mood
                가정법       subjunctive mood
                원망법       optative mood
                명령법       imperative mood
겸칭
서법

accusative (대격) (used to mark direct objects; Latin, Finnish)
active intransitive verb (동작 자동사)
active transitive verb (동작 타동사)
active verb (동작 동사)
adnomial ending (관형형 어미)
adnomial particle (관형조사)
adnominal (관형사)
adverb (부사어)
adverbial (부사)
adverbial particle (부사격 조사)
agent (행위자)
attributive-determinative words (관형어)
auxiliary particle (보조사)
auxiliary verb (조동사)
basic structure (기본 구조)
bound noun (의존 명사)
cardinal number (기수사)
case (격)
- 통사론적 격 (주격, 목적격, 관형격, 부사격 등)
- 형태론적 격 (nominative, genitive, dative, accusative 등)
- 의미론적 격 (agent, experiencer, instrument, objective, locative, goal 등)
case particle(격조사)
causative (사동)
causative suffix (사동 접미사)
causative verb (사동사)
cause (원인)
class of adverbials (부사의 종류)
class of nouns (명사의 종류)
class of verbs (동사의 종류)
clause (절)
coordinate clause (대등절)
subordinate clause (종속절)
adverbial clause (부사절)
main clause (주절)
comitative (공동성, 공격 `와')
comparative (비교격)
compound noun (합성 명사)
compounded verb (합성 동사)
concession (양보)
condition (조건)
conjugation (어미 활용)
conjugation of verbs (동사의 활용)
conjugative ending of verbs (동사의 활용어미)
conjuncts (접속절)
conjunction (접속사)
coordinate conjunction (등위 접속문) : 선행절과 후행절이
통사적으로는 물론이고 의미적으로도 대등한 관계를 맺음으로써
대칭성을 띤다.
subordinate conjunction (종속 접속문) : 통사적으로는 접속절끼리
대등한 관계에 있지만, 의미적으로는 선행절이 후행절에 대한
수식적 기능을 가짐으로 해서 접속절들 사이에 비대칭성이 작용한다.
phrasal conjunction (구 접속)
conjunction reduction (접속문 줄이기)
conjunctive ending (연결어미)
conjunctive particle (접속 조사)
conjunctive structure (접속 구조)
conjunctor (접속사, 접속소)
contraction (축약)
contrastive (대조)
coocurrence (호응)
dative (여격)(used to mark indirect objects; Latin)
declarative (서술)
deletion (탈락)
demonstrative pronoun (지시대명사)
dependent noun (의존 명사)
descriptive verb (형용 동사)
direct narrative (직접 화법)
diversion (역접)
enumeration (나열)
experiencer (경험자)
following vowel (후행 모음)
formal speech level (높임의 격식체)
gender (성)
genitive (속격)
goal (달격??)
grammatical function (문법적 기능)
grammatical relation (문법적 관계)
high form (존대형 높임)
homophones : words that sound alike but are spelled differently
honorific form (존대법)
honorific suffix (존칭 접미사)
imperative (명령)
independent noun (완전 명사)
indirective narrative (간접 화법)
informal speech level (높임의 비격식체)
instrument (도구)
instrumental (조격)
intent (의도)
interrogative (의문)
interrogative pronoun (의문대명사)
interruption (전환)
intransitive verb (자동사)
irregular verb (불규칙 동사)
locative (처격)
long-form (장형)
long-form negativee (장형 부정)
long-form passive (장형 피동)
low form (하대형 높임)
main subject (전체의 주어)
modified structure (수식 구조)
movement of action (동작의 이동)
narrative (화법)
negative (부정)
negative form (부정형)
neutral form (중립형 높임)
nominal ending (명사형 어미)
nominative 명(사)격??
nominative particle (주격 조사)
noun (명사)
noun-class words (명사류어)
number (수사)
object (목적어)
objective particle (목적격 조사)
ordinal number (서수사)
particle (조사)
passive (피동)
passive suffix (피동 접미사)
personal pronoun (인칭 대명사)
postposition (조사)
phrase (구)
position of adverbials (부사의 위치)
possessive (소유격)
preceding vowel (선행 모음)
predicative noun (서술 명사)
presentation of situation (상황 제시)
pronoun (대명사)
propositive (청유)
reason (이유)
selection (선택)
sentence construction type (문장 구성 유형)
sentence structure (문장의 구조)
short-form (단형)
short-form negative (단형 부정)
short-form passive (단형 피동)
special usage of nouns (명사의 특별한 쓰임)
speech level (상대 높임)
subject (주어)
subject of predicate clause (서술절의 주어)
suffix after noun (명사 뒤에 나타나는 접미사)
tense (시제)
terminative ending (종결어미)
topic (화제)
transitive verb (타동사)
utterance situation (발화상황)
verb (동사)
vowel harmony (모음조화)
word order (문장의 어순)
 
#!/usr/bin/perl -w
#
$a = "123(ad(f(d(z(a(e))))))456";
$b = "123(adfd)456";
$c = "123(ad)4(fd)56";

$NesteD = qr/ \(( [^()] | (??{ $NesteD }) )* \) /x ;
$a =~ s/$NesteD//gx;
$b =~ s/$NesteD//gx;
$c =~ s/$NesteD//gx;
print "$a\n$b\n$c\n";

+ Recent posts