質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

6511閲覧

TypeError: __init__() missing 3 required positional arguments: 'request', になるのはなぜでしょうか

eisaku123

総合スコア77

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/03/10 13:32

Pyhonのクラスに関することで細かいことになるのですが

server = HTTPServer((host, port), Handler)

正常に動作しますが

hand=Handler() にして
server = HTTPServer((host, port),hand )

に変更すると以下のようなエラー(標記)になってしまいます。

インスタンスにしてから引数にセットするとなぜエラーになるのかわかりませんので
ご教授よろしくお願いいたします。

ソースはさらに下にあります。

(python3-toku) pi@raspberrypi:~/toku1/01-04-a1/package_parts $ python app_server.py __main__ Traceback (most recent call last): File "app_server.py", line 147, in <module> run(app) File "app_server.py", line 85, in run hand=Handler() TypeError: __init__() missing 3 required positional arguments: 'request', 'client_address', and 'server

ソース
※の部分3点を変更

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3from http.server import BaseHTTPRequestHandler, HTTPServer 4import os, time 5 6import wiringpi 7from parts import Led 8 9# グローバル変数 10_application = None 11_server = None 12 13 14class Handler(BaseHTTPRequestHandler): 15 """ HTTPリクエストを処理するクラス """ 16 17 def do_GET(self): 18 """ GETメソッドによるHTTPリクエストを処理する関数 """ 19 global _application 20 if self.path == '/shutdown': 21 self._do_response('shutdown') 22 global _server 23 if _server is not None and _server.socket is not None: 24 _server.socket.close() 25 _server = None 26 return 27 if _application is not None: 28 result, response_body = _application.exec(self.path) 29 if result: 30 self._do_response(response_body) 31 else: 32 result = self._do_file_response(self.path) 33 if not result: # 上記にあてはまらない場合は対応するパスがない 34 self.send_error(404, 'File Not Found: {0}'.format(self.path)) 35 return 36 37 def _do_response(self, s): 38 """ 省略 """ 39 40 def _do_file_response(self, url_path): 41 """ 省略""" 42 43def run(app=None, host='0.0.0.0', port=8080, cam=None): 44 """ サーバー起動用関数 45 app: アプリケーション機能拡張用オブジェクト exec()メソッドが必要 46 host: 待機するIPアドレス 47 port: 待機するポート 48 cam: mjpeg_server用カメラオブジェクト start(), stop(), capture() メソッドが必要 49 """ 50 global _application 51 global _server 52 _application = app 53 hand=Handler() ※-----ここを追加 54 server = HTTPServer((host, port),hand )※-------これに変更 エラーになる 55 #server = HTTPServer((host, port), Handler)※---これをこコメントアウト 正常 56 print(time.asctime(), 'Server start - {0}:{1}'.format(host, port)) 57 try: 58 _server.serve_forever() 59 except ValueError: 60 print('remote shutdown') 61 except KeyboardInterrupt: 62 print('KeyboardInterrupt') 63 finally: 64 if _server is not None and _server.socket is not None: 65 _server.socket.close() 66 print(time.asctime(), 'Server stop - {0}:{1}'.format(host, port)) 67 68 69if __name__ == '__main__': # このファイルがスクリプトとして実行される時だけ処理を実行 70 71 print(__name__) 72 #run() 73 # -- 定数宣言 -- # 74 # LEDのGPIO番号 75 LED_PIN = 4 76 # HTTPレスポンス用HTMLデータ 77 HTML_TEXT = """ 78 <!doctype html> 79 <html> 80 <head> 81 <meta charset="UTF-8"> 82 <title>toku1/01</title> 83 </head> 84 <body> 85 <p><input type="button" value="点灯" onclick="location.href='/led/1'"></p> 86 <p><input type="button" value="消灯" onclick="location.href='/led/0'"></p> 87 <p><input type="button" value="停止" onclick="location.href='/shutdown'"></p> 88 </body> 89 </html> 90 """ 91 92 93 class Led01(Led): 94 """ app_server対応版parts.LEDクラス """ 95 96 def exec(self, path): 97 """ ルーティング処理を記述 """ 98 if path == '/led/0': 99 self.set_status(0) # LED消灯 100 elif path == '/led/1': 101 self.set_status(1) # LED点灯 102 else: 103 return False, '' 104 result_body = self.render_template() 105 return True, result_body 106 107 def render_template(self): 108 """ レンダリング処理を記述 """ 109 return HTML_TEXT 110 111 # 自作のLED01を使ったWebアプリの実行 112 wiringpi.wiringPiSetup() 113 app = Led01(LED_PIN) 114 run(app) 115 116 117 118 119

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なぜか、というより、そもそもクラスを取る仕様なのでインスタンス化して渡すのは明確な間違いなのです。

class http.server.HTTPServer(server_address, RequestHandlerClass)¶

このクラスは TCPServer クラスの上に構築されており、サーバのアドレスをインスタンス変数 server_name および server_port に記憶します。 サーバはハンドラからアクセス可能で、通常ハンドラの server インスタンス変数からアクセスします。
http.server --- HTTP サーバ — Python 3.8.2 ドキュメント

受け取ったハンドラは内部で適切な引数でインスタンス化されます。


エラー自体は、Handlerクラスの親クラスの__init__の定義に起因します。__init__をオーバーライドしていないので、親クラスの定義のままです。
(オーバーライドすればいい、という意味ではありません。念の為)

class http.server.BaseHTTPRequestHandler(request, client_address, server)

http.server --- HTTP サーバ — Python 3.8.2 ドキュメント

コンストラクタは3つの引数を要求するので、hand=Handler()を追加した時点でエラーに鳴ります。

投稿2020/03/10 14:10

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eisaku123

2020/03/11 11:52

hayataka2049さん ありがとうございます! ここまでの解決にいたるには私の知識ではたどりつけなかったです。 ドキュメントをよめるようにしたいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問