ããã«ã¡ã¯ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®æ°å®¶ï¼@mowmow1259ï¼ã§ãã ã¨ã ã¹ãªã¼ç¦å²¡ãªãã£ã¹ã®ä¸äººç®ã®ã¨ã³ã¸ãã¢ã¨ãã¦ç¦å²¡ã§åãã¦ãã¾ãã ãã¯ããã«ãã®æè¦ãã¼ã¬ã¼ã好ãã§ãä»å¹´ãçºå£²éå§å½æ¥ã«é£ã¹ã«è¡ãã¾ããã
ç§ãæå±ããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯åºæ¬çã«2é±éãã1ã¶æç¨åº¦ã§æ°è¦ãããã¯ãããªãªã¼ã¹ãããªã©ãé«éã«ãããã¯ããéçºãã¦ãã¾ãã ãã®éç¨ã§ãããã®æ¸ãæ¹ã¯è½ã¨ãç©´ããããã使ããªãæ¹ããããã¨ãã£ãéçºã«éãããã¹ããã©ã¯ãã£ã¹ãæºã¾ã£ã¦ããã¾ãã ãããã£ããã¹ããã©ã¯ãã£ã¹ã¯ã¬ãã¥ã¼ã§ã®ææãæè¡å ±æä¼*1ã§ãã¼ã ã«æµ¸éãã¦ãã¾ãããã¬ãã¥ã¼è² è·ãæ°ã¡ã³ãã¼ã¸ã®å¨ç¥ãªã©ã«èª²é¡ãããã¾ããã
ãã®è¨äºã§ã¯ãããã解決ããããã«ãã¹ããã©ã¯ãã£ã¹ãLinterã®ç¬èªruleã¨ãã¦è¦å®ããCIã§èªåæ¤ç¥ãããã¨ã§ãã¼ã å ¨ä½ã«å¨ç¥ããåãçµã¿ã«ã¤ãã¦ç´¹ä»ãã¾ãã
- ãã¹ããã©ã¯ãã£ã¹ã®èç©
- ãã¹ããã©ã¯ãã£ã¹ã®æµ¸éã®åãçµã¿
- ãã¹ããã©ã¯ãã£ã¹ã®æµ¸éã®é£ãã
- Linterã®ç¬èªã«ã¼ã«ã¨ãã¦èªåãã§ãã¯ãã
- åãããã¯ãã¸ã®å°å ¥
- å°å ¥ã®å¹æ
- ã¾ã¨ã
- We are hiring !!
ãã¹ããã©ã¯ãã£ã¹ã®èç©
AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãæå¸ã«ããããç«ã¡ãã¼ã ã©ã³ãæã¡ç¶ãããã¨ãããã¼ã ããªã¥ã¼ãæ²ãã¦ãããæ°å¤ãã®ãããã¯ããæ¥ã çã¿åºããã¦ãã¾ãã ã»ã¨ãã©ã®ãããã¯ãã¯ãã¼ã ã¡ã³ãã¼1人ã主æ å½ã¨ãã¦éçºãéç¨ã¾ã§ãæ å½ãã¦ããï¼ãã¡ããä»ã¡ã³ãã¼ã®å©åããããããããã¾ãï¼ããããã¹ãã¼ãæã®æºã«ãªã£ã¦ãã¾ãã
ãã®é«éãªãããã¯ãéçºã®ãµã¤ã¯ã«ããã¼ã ã¨ãã¦é²ãã¦ããã«ã¤ããããã®æ¸ãæ¹ã¯è½ã¨ãç©´ãå¤ãã®ã§ä½¿ããªãã»ãããããã¨ãã£ãéçºã»éç¨ä¸ã®ãã¹ããã©ã¯ãã£ã¹ãå¾ã ã«æºã¾ã£ã¦ããã¾ãã
ä¾ãã°ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯gokartã¨ããæ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³ã©ã¤ãã©ãªããã使ãã®ã§ããããã®ä¸ã§ããã°ãçã¿ãããæ©è½ã¯ä½¿ç¨ãé¿ããããã¦ãã¾ãã ãããã£ãç¥è¦ã¯ãéçºã»éç¨ä¸ã®é害ãæªç¶ã«é²ããã®ã§ããããããã§ããã ããã¼ã ã«æµ¸éããããã§ãããã
ãã¹ããã©ã¯ãã£ã¹ã®æµ¸éã®åãçµã¿
ãã ãåè¿°ã®éãAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯åãããã¯ããåºæ¬çã«1人ã§éçºãã¦ããã¾ãã ãã®ããããããããã¯ãã§çºè¦ãããç¥è¦ã¯ãã®ãããã¯ãã®æ å½è ãã¾ããã®ã¬ãã¥ã¢ã«éãã¦ãã¾ããã¡ã§ãã
ããããã¼ã å ¨ä½ã«éå ã浸éããããããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯æè¡å ±æä¼ã¨ããä¼ãé±ã«ä¸åº¦éå¬ãã¦ãã¾ãã ããã¯ãæè¡çã«é¢ç½ã話é¡ãéçºä¸çããç¥è¦ããã¹ãã¢ã¼ãã ãªã©ããã¼ã ã¡ã³ãã¼ã«ç´¹ä»ããä¼ã§ãã ãã¹ããã©ã¯ãã£ã¹ã¯ãã®ä¼ã§é©å®å ±æããããã¼ã ã¡ã³ãã¼å ¨å¡ã«å¨ç¥ããã¾ãã
å°ãæ¬çã¨å¤ãã¾ããããã®æè¡å ±æä¼ã¯ãã¹ããã©ã¯ãã£ã¹ã®ä»ã«ãç´æ¥æ¥åã«é¢ä¿ã®ãªãã®ã¼ã¯ãªè©±é¡ãå¤ã ãããä¾ãã°docker imageã®è»½éåããææ°ã®æ©æ¢°å¦ç¿å¨ãã®è©±é¡ãã¯ãã¾ãã¨ã³ã¸ãã¢ãç¥ã£ã¦ããã¹ãä¼è¨/ç¨åã®è©±ãªã©ãæ¬å½ã«è²ã ãªè©±é¡ãæ¯é±è©±ããã¦ãã¾ããå¿ããä¸ã§ãæè¡ã¸ã®å¥½å¥å¿ãå¿ããªããã¼ã æåããã表ãã¦ãã¦ãã¨ã¦ã好ããªåãçµã¿ã®1ã¤ã§ãã
ãã¹ããã©ã¯ãã£ã¹ã®æµ¸éã®é£ãã
ãã¹ããã©ã¯ãã£ã¹ã¯æè¡å ±æä¼ã§å ±æããããã®ã®ããã®æµ¸éã«ã¯ä¾ç¶ã¨ãã¦èª²é¡ãããã¾ãã åºæ¬çã«äººéã¯å¿ããçãç©ãªãããä¸åº¦å ±æãããç¥è¦ãéçºæã«å¿ããå¾¹åºãããã¨ã¯æã£ã以ä¸ã«é£ããç¹ã§ãã æè¡å ±æä¼æã®ã¹ã©ã¤ãçã¯ã¹ããã¯ããã¦ãããã®ã®ãé »ç¹ã«è¦è¿ããã®ã§ã¯ãªãã§ãããæãªãã§æ¸ãã³ã¼ãã«å¯¾ãã¦é½åº¦æèãæããã¨ã¯é£ãããã®ã§ãã 第ä¸ã人éã®æ³¨æåã«é ¼ã£ãè¦ç´ã¯ã¨ã³ã¸ãã¢çã§ã¯ããã¾ããããã
ã¾ããæ°ã¡ã³ãã¼ã¸ã®ç¥è¦ã®å¨ç¥ã課é¡ã§ãã å½ç¶ãªããæ°ã¡ã³ãã¼ã¯éå»ã®æè¡å ±æä¼ã«åå ãã¦ããªããããªã®ã§ãç¥è¦ã®åå¨ãç¥ãã¾ããã å¤ãã®å ´åã¬ãã¥ã¼ã§ææããã¾ãããã¬ãã¥ã¼ãæ¼ãããã¨ãããã¾ãããããããåã 人ã®ã¬ãã¥ã¼ã«é ¼ãæåã好ã¾ããããã¾ããã
Linterã®ç¬èªã«ã¼ã«ã¨ãã¦èªåãã§ãã¯ãã
å¨ç¥ã»å¾¹åºã人éã«é ¼ã£ã¦ããã®ããã¡ãªã®ã§ãã£ã¦ããããLintã¿ããã«èªåã§ãã§ãã¯ããã°ãããããªããã¨ãããã¨ã§ãç¾å¨ã¯ãã¼ã å ã®ãã¹ããã©ã¯ãã£ã¹ã«å¾ã£ã¦ããããæ¤ç¥ããLinterã®ç¬èªã«ã¼ã«ã社å åãã«ä½æããCIã«çµã¿è¾¼ãã§ãã¾ãã ãããããã¨ã§ããã¹ããã©ã¯ãã£ã¹ã«å¾ããªãã³ã¼ãã¯ã¬ãã¥ã¼åã®æç¹ã§Lintãè½ã¡ã人éãä»ãããã¹ããã©ã¯ãã£ã¹ãå¾¹åºããã¾ãã ã¾ããLintã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ãã§ããã ãä¸å¯§ã«ãã¦ãããæ°ã¡ã³ãã¼ããããè¦ãã ãã§ç¥è¦ãã¤ã³ã¹ãã¼ã«ã§ããããã«ãªã£ã¦ãã¾ãã
ããããã¯ãPythonã§å®éã«Linterã®ç¬èªã«ã¼ã«ãä½æããäºä¾ãç´¹ä»ãã¦ããã¾ãã
å®è£ ãããã¹ããã©ã¯ãã£ã¹
ããã§ã¯ãåè¿°ã®gokartã«å¯¾ãã¦å°å ¥ããruleãä¾ã¨ãã¦åãä¸ãã¾ãã
gokartã¯Parameter
ã¨ããã¯ã©ã¹å¤æ°ãå®ç¾©ãããã¨ã§ã¯ã¼ã¯ããã¼ä¸ã®è¨å®ãè¨å®ãã¡ã¤ã«çããèªã¿è¾¼ããã¨ãã§ãã¾ãã
ãã®Parameter
ã®ä¸ã¤ã¨ãã¦ListParameter
ã¨ããã¯ã©ã¹ãããã®ã§ãããListParameter
ã¯listãåãä»ããä¸æ¹ã§ãå
é¨çã«ã¯tupleãæ±ã£ã¦ããããã®å¤ã¯tupleã¨ãã¦è¿å´ããã¾ãã
ListParameter
ã¨ããå½åããlistãè¿å´ãããã¨åéããããã°ãã°listã¨tupleã®éãã«ãããã°ãçãã§ãã¾ãã*2ã
ããããã¯ãä¸å³ã®ããã«ListParameter
ã使ç¨ããå ´åã«ãæ··ä¹±ã®å°ãªãTupleParameter
ã«æ¸ãæãã¦ãããruleãä½æãã¦ããã¾ãã
Linterã®é¸å®
ãã¼ã ã§ã¯ruffãPythonã®Linterã¨ãã¦æ¡ç¨ãã¦ãã¾ãããæ®å¿µãªããruffã«ã¯ç¬èªã«ã¼ã«ãè¨è¿°ããããèªä½pluginãèªã¿è¾¼ã¾ãããããæ©è½ã¯ãªãªã¼ã¹ããã¦ãã¾ãã*3ã ãã®ãããç¬èªã«ã¼ã«ããããLinterãæ°ãã«é¸å®ããå¿ è¦ãããã¾ãã ããã¤ãåè£ãããã¾ãããä»åã¯staræ°ãå¤ãæ©è½ããããã«ãªPylintãæ¡ç¨ãã¾ãã*4ã
ç¬èªã«ã¼ã«ã®è¨è¿°
Pylintã«ã¯Custom Pylint Checkerã¨ãã¦ç¬èªã®lintã«ã¼ã«ãpluginã¨ãã¦è¿½å ã§ããæ©è½ãããã¾ãã Pylintã®å®è¡æã«èµ°æ»ãããASTã«ã¤ãã¦ãåãã¼ã訪åæã®callbackã¨ãã¦lintã«ã¼ã«ãå®è£ ã§ãã¾ãã
å ¬å¼ããã¥ã¡ã³ããä¸å¯§ãªããããããåç §ããã°å®è£ ã¯ããã¾ã§é£ããããã¾ããã å®éã®å®è£ ä¾ã以ä¸ã«ç´¹ä»ãã¾ãã
import astroid from pylint.checkers import BaseChecker from pylint.lint import PyLinter class ListParameterChecker(BaseChecker): """ListParameterã使ãã¨tupleãè¿ãã®ã§ãTupleParameterã使ãããã«è¦åããã""" # ãã®ruleã®ã¡ã¿ãã¼ã¿ãååãlintæã®ã¡ãã»ã¼ã¸ãå®ç¾©ããã name = 'list-parameter-use' msgs = { 'W0001': ( 'ListParameter should not be used. Please use TupleParameter instead.', 'list-parameter-use', 'ListParameter is confusing because the return value is tuple. Please use TupleParameter instead.', ), } def visit_assign(self, node: 'astroid.Assign') -> None: """å¤æ°ã¸ã®ä»£å ¥nodeã®callbacké¢æ°ã 以ä¸ã³ã¼ãä¾ã«ããããListParameterã«è¨ªããéã®å¦çãè¡ã class TaskA(TaskOnKart): a = ListParameter() """ value = node.value # nodeãCallï¼å¼ã³åºãï¼ã§ããããã¤ãã®å¼ã³åºããListParameterã¨ããååã®ã¯ã©ã¹ã§ãã£ãå ´åã«ã # add_messageã§ã«ã¼ã«éåã¨ãã¦æ¤ç¥ãã if isinstance(value, astroid.Call) and isinstance(value.func, astroid.Attribute) and value.func.attrname == 'ListParameter': self.add_message('list-parameter-use', node=node) def register(linter: 'PyLinter') -> None: """ListParameterCheckerãPylintã®ruleã¨ãã¦ç»é²ãã """ linter.register_checker(ListParameterChecker(linter))
ããã¯ListParameter
ã¨ããã¯ã©ã¹ã®ä»£å
¥ãæ¤ç¥ãTupleParameter
ã®ä½¿ç¨ãæ¨å¥¨ããã«ã¼ã«ã§ãã
BaseChecker
ãç¶æ¿ããã¯ã©ã¹ã«ã¤ãã¦ãã¯ã©ã¹å¤æ°ã¨ãã¦ã«ã¼ã«åname
ãã«ã¼ã«ã®è¨å®msgs
ãè¨å®ãã¾ãã
ã¾ããvisit_assign
ã¨ãã£ãããã«ASTã®ãã¼ãåãæå®ããcallbackãè¨å®ããadd_message
ãããã¨ã§ãã®ã«ã¼ã«ãæ¤ç¥ããããã¨ã«ãªãã¾ãã
ããã§ã¯ä»£å
¥å¼ã®å³è¾ºã«ListParameter
ãæå®ãããå ´åã«æ¤ç¥ãããç°¡åãªã«ã¼ã«ãä½ã£ã¦ãã¾ãããæ¬æ¥ã¯ListParameter
ãç¹å®ã®ã¢ã¸ã¥ã¼ã«ï¼ããã§ã¯luigiï¼ã®ãã®ã§ãã確èªãããå¿
è¦ãããã¾ããvisit_import
ãªã©ã§importããã¢ã¸ã¥ã¼ã«ãç¶æ
ã¨ãã¦æã¤ãã¨ã§å®ç¾ã§ãã¾ãããããã§ã¯ç°¡åã®ããçãã¾ãã
ã¾ãã次ã®ããã«ãã¹ãããããããä¿å®æ§ãæªããªãããã§ãã
def test_list_parameters_with_assign(self) -> None: # @ãã³ã¡ã³ãã¨ãã¦ä»è¨ãããã¨ã§ããã®è¡ã®nodeãæ½åºãã node = astroid.extract_node( """ import gokart import luigi class TaskA(gokart.TaskOnKart): a = luigi.ListParameter() #@ """ ) with self.assertAddsMessages( MessageTest( msg_id='list-parameter-use', node=node, confidence=UNDEFINED, line=6, col_offset=4, end_line=6, end_col_offset=29, ) ): self.checker.visit_assign(node)
ãã¨ã¯ä½æããcheckerãlinter.register_checker
ã§ç»é²ããpackageã«ããä¸ã§Pylintã®pluginã¨ãã¦èªã¿è¾¼ãã°ä½¿ããããã«ãªãã¾ãã
pluginã¯pyproject.toml
ã§ã¯æ¬¡ã®ããã«æå®ã§ãã¾ããåºæ¬çãªLinterã¯åè¿°ã®éãruffã使ç¨ããããããç¬èªã«ã¼ã«ä»¥å¤ã¯ç¡å¹åãã¦ãã¾ãã
[tool.pylint.MASTER] load-plugins = ["pylint_gokart"] disable = "all" enable = ["list-parameter-use"]
åãããã¯ãã¸ã®å°å ¥
AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯cookiecutterã§ããã¸ã§ã¯ããåæåãcruftã§ææ°ã®ãã³ãã¬ã¼ãã«è¿½å¾ããéç¨ããã¦ãã¾ãã ãã®ä»çµã¿ã使ããããã¸ã§ã¯ããã³ãã¬ã¼ãã«ä»åã®Linterãå°å ¥ããcruftã«ããåãããã¯ãã«åãè¾¼ãã§ããã¾ããã
ãã®è¾ºã®éç¨ã«ã¤ãã¦ã¯è©³ããã¯æ¬¡ã®è¨äºã§ç´¹ä»ãã¦ãã¾ãã®ã§ããã²ãã¡ããã覧ãã ããï¼
å°å ¥ã®å¹æ
å°å ¥å¾ãã°ããçµéãã¦ãã¾ãããCIã§ãã¹ããã©ã¯ãã£ã¹ã«æ²¿ããªãã³ã¼ããæ©éæ¤ç¥ããã¦ãã¾ãã ã¾ããLinterã¨ãã¦ä¿®æ£ãåã°å¼·å¶ããããã¨ã§ãå¤ããããã¯ãã§ããã¹ããã©ã¯ãã£ã¹ã«åããªããã®ãä¿®æ£ããã¦ããå¹æãããã¾ãã ã¬ãã¥ã¼è² è·è»½æ¸ã¯ãã¡ããã®ãã¨ãã³ã¼ããªã¼ãã£ã³ã°ã®èªç¥è² è·è»½æ¸ã«ãã¤ãªããã¾ãããè¸ã¿ãã¡ãªãã°ãæªç¶ã«é²ããã¨ãã§ãããããä»ã®æå°å ¥ãã¦è¯ãã£ãã¨æãã¦ãã¾ãã
ã¾ã¨ã
AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ãã¹ããã©ã¯ãã£ã¹å¨ç¥ã«é¢ããåãçµã¿ãç´¹ä»ãã¾ããã ã¬ãã¥ã¼ãããã¥ã¡ã³ãã«é ¼ããLinterã¨ãã¦éç¨ãã¦ãããã¨ã§ã人éã«é ¼ããªãå¨ç¥ã®ä»çµã¿ãæ§ç¯ã§ãã¾ããã ä»åã¯Pythonã«ã¤ãã¦ç´¹ä»ãã¾ããããä»è¨èªã§ãç¬èªã«ã¼ã«ãå°å ¥ã§ããå種ãã¼ã«ãããã¾ãã®ã§ãã¿ãªããã試ãã¦ã¿ã¦ã¯ãããã§ããããã
We are hiring !!
ã¨ã ã¹ãªã¼ã§ã¯ãããã¯ããé«éã«éçºãã¦ãããããçç£æ§åä¸ã®ããã®æ¹åãç©æ¥µçã«è¡ãªã£ã¦ãã¾ãï¼ ãããªãã¼ã ã®é°å²æ°ã«å°ãã§ãèå³ãããæ¹ã¯ã次ã®URLããã«ã¸ã¥ã¢ã«é¢è«ããå¿åãã ããï¼
ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã
ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã
ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã
*1:AIã»æ©æ¢°å¦ç¿ãã¼ã ã§é±ã«ä¸åº¦è¡ããã¦ãããé¢ç½ããå ±æãããæè¡ã®å ±æä¼ã§ã
*2:ä¾ãã°pandasã®ã«ã©ã ã®æå®ã§ã¯ãlistã§æå®ããå ´åã¯è¤æ°ã«ã©ã ã®æå®ã«ãªãã¾ãããtupleã§æå®ããå ´åã¯tupleãå¤ã¨ãã1ã¤ã®ã«ã©ã ãæå®ãããã¨ã«ãªãã¾ãã
*3:è°è«èªä½ã¯æ´»çºã«ããã¦ããããã§ããhttps://github.com/astral-sh/ruff/issues/283 åç §
*4:ä»ã«ã¯flake8ãsylver-cliãªã©ãåè£ã«ä¸ããã¾ãããã«ã¼ã«ã®ä¿å®æ§ãªã©ããPylintãflake8ã«çµããstaræ°ã®å¤ãPyilntã«æ±ºå®ãã¾ããã