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

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

ただいまの
回答率

90.33%

  • Python 3.x

    7401questions

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

python3 自作関数の実行について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 214
退会済みユーザー

退会済みユーザー

お世話になります、python初心者です。
ご教示願えれば幸いです。

 python3

python3.6.6

 わからないこと

unittestを利用している中、コードをclass内の別の関数として分割して管理したい。

 やったこと

以下のコードを実行しましたところ [my_func() is not defined.]というようなメッセージが出ました。
これが何故なのか教えていただきたいです。
ソースを全文添付したいのですが今は出来ないのでここまでとさせてください。
よろしくお願いいたします。

 コード

# -*- coding: utf-8 -*-
import unittest
import re
import logging
import requests
import json
from selenium import webdriver
class MakeList(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Remote(
            command_executor='http://localhost:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)

    def my_func():
        print("hello world.")

    def test_make_list(self):
        #....
        my_func()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/07/03 02:16

    エラーメッセージとソースコードがあってませんが、my_log は定義されてるんですか?ソースコードは省略せずに全部貼ったほうが適切な回答が得られやすいですよ。

    キャンセル

  • hayataka2049

    2018/07/03 03:00

    エラーも省略せず掲載した方がこの場合良いと思います(ユーザ名等は伏せても構いません)

    キャンセル

回答 2

checkベストアンサー

0

 TLDR

my_funcを呼ぶ側がクラスと関係のない関数として呼び出そうとしているのが原因です。
また、貴方の呼びたい"my_func"の定義の仕方自体も少し間違っています。

クラス内の別の関数ということなのでインスタンスメソッドかクラスメソッドにしてしまいましょう。

class MakeList(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Remote(
            command_executor='http://localhost:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)

    #こうする
    def my_func_instance(self):
        print("hello world : instance method")

    #もしくはこうする
    @classmethod
    def my_func_class(cls):
        print("hello world : class method")

    #そしてこうする
    def test_make_list(self):
        #....
        self.my_func_instance()
        MakeList.my_func_class()

出力:

hello world : instance method
hello world : class method

 細かく

test_make_list(self)はmy_funcをクラスの外部にある関数として呼び出そうとしています。

class MakeList(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Remote(
            command_executor='http://localhost:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)

    def my_func(): # 呼ばれない (無視される)
        print("hello world : Inside of the class ")

    def test_make_list(self):
        #....
        my_func() # 自インスタンスや自クラスから呼んでいない -> じゃあクラスの外部にあるんだ!


def my_func(): # ここにあれば呼べる
    print("hello world : Outside of the class")

出力:

hello world : Outside of the class

もし"my_func"がインスタンスの情報を触るのであれば、それはインスタンスメソッドとして定義してあげましょう。

以下のようにしましょう:

def my_func(self): # 1. "self"を足す = インスタンスメソッド
    #self.諸々 にアクセスできる
    ...

def test_make_list(self):
    #....
    self.my_func() # 2. 自インスタンスを頭につける (強制的に第一引数にインスタンスが入る)

もし"my_func"がクラスの情報だけを触るのであれば、それはクラスメソッドとして定義することもできます。
クラスメソッドは@classmethodデコレータで飾られている必要があります。

以下のようにしましょう:

# 1. デコレータを与える = クラスメソッド
@classmethod 
def my_func(cls): # 2. 第一引数として自分自身のクラスを取る
    # cls.諸々 にアクセスできる = MakeList.諸々 と同義
    # インスタンス変数 (self) にはアクセスできない
    ...

def test_make_list(self):
    #....
    MakeList.my_func() # 3. クラス名を頭につける (強制的に第一引数にクラスが入る)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/08 13:33

    遅くなり失礼しました。
    ご教示ありがとうございました。

    キャンセル

0

https://docs.python.jp/3/library/unittest.html

def my_func():
    ...

def test_make_list(self):
    #....
    my_func()


selfを引数に取らないケースをどこかで見かけたことありますか?
メソッドのコールも同様。クラスの基本的な使い方かと。

def my_func(self):
    ...

def test_make_list(self):
    #....
    self.my_func()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python 3.x

    7401questions

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