TypeError: console() takes from 1 to 3 positional arguments but 4 were given

Python
本ページはプロモーションが含まれています

はじめに

robotframeworkからpythonを呼び出そうとした時にエラーが発生しました。
pythonは自作の関数で、ログをrobotframeworkに出力しようとした時に失敗したからでした。
今回はその時のエラーの原因と対処方法についてです。

エラー

ソースはソケットを使う簡単なテストのソースコードでです。
robotframeworkからpythonのsocketライブラリを呼び出して使うようにしていたのですが、出力結果をrobotframework上のコンソールに出したくてloggerを使っていた時に発生。

ソースコードは次のようなものです(簡略化しています)
こちらはrobotframeworkのコード。

# call_socket.robot

*** Settings ***
Library socket_test.py

*** Variables ***
${IP_ADD} 127\.0\.0\.1

*** Keywords ***


*** Test Cases ***
Test
    ${return_wd}= py_socket ${IP_ADD} 4000
    Log To Console ${\n}${return_wd}

こちらがpythonのコードです。

import socket
from robot.api import logger

def py_socket(ip_addr, port_num):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    param = (ip_addr, int(port_num))
    s.connect(param)

    print(ip_addr, 'Port:', str(port_num), 'へ接続中')
    logger.console(ip_addr, 'Port:', str(port_num), 'へ接続中')

    s.send(b'test')
    result = int(s.recv(256).decode().rstrip('\n'))

    return result

エラーメッセージは

TypeError: console() takes from 1 to 3 positional arguments but 4 were given

というものです。

エラーを訳すと
「型によるエラー:console()は1〜3つの引数を取りますが実際4つ渡されています」
とあります。

原因

原因はpythonのコード10行目の
logger.console(ip_addr, ‘Port:’, str(port_num), ‘へ接続中’)
の部分です。

pythonのprint()の場合、9行目のようにカンマ区切りで文字列をつなげることが可能です。
(print()は「+」で連結も可能)

ですが、loggerの場合は文字の連結はカンマ区切りでは利用できません。
loggerで文字列を結合する場合「+」で連結する必要があります。

次が修正したソースコードです。

import socket
from robot.api import logger

def py_socket(ip_addr, port_num):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    param = (ip_addr, int(port_num))
    s.connect(param)
    print(ip_addr, 'Port:', str(port_num), 'へ接続中')
    logger.console(str(ip_addr)+ "Port:" + str(port_num) + "へ接続中")

    s.send(b'test')
    result = int(s.recv(256).decode().rstrip('\n'))

    return hantei

intの箇所はstr()でキャストして文字列に変換しています。

さいごに

今回はrobotframeworkとpythonを利用した際にログ表示部分のミスによるエラーでした。
pythonの外部ライブラリを呼び出して使えるのがrobotframeworkの良い点です。
外部結果をrobotframeworkに表示したい事も多く、loggerは頻繁に利用すると思います。

robotframeworkの文法はかなりpythonライクじゃないのでpythonの書き方をするとこの様にエラーになることもよくありますので注意が必要ですね。

この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。

タイトルとURLをコピーしました