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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6448questions

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

[Python]関数の外で定義した別の関数を呼び出したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 468

Paai

score 6

下記のコードでaaaからbbbを呼び出したいのですが、実行すると以下のエラーが出ます。
「NameError: name 'bbb' is not defined」

aaa内でbbbを定義した場合は問題なく実行できるのですが、他の関数からも使いまわしたいのでaaaの外で定義したいのですが、どうしたらいいでしょうか?

↓実行したいコード

    def bbb():
            return '戻り値'

    async def aaa():
            xxx = bbb()

↓問題なく実行できるコード

    async def aaa():
            def bbb():
                        return '戻り値'

            xxx = bbb()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+6

他の方がおっしゃっているように「再現できる最小限のコード」を示すというのはQ&Aをする際に非常に大切な事項だと思います。そうせずに一部だけ提示している質問もあるのですがそれは「質問者がその部分だけで閲覧者に質問内容が伝わる」ということを確信できるだけの知識をお持ちの場合ではないでしょうか?

NameErrorは文法や言語仕様に直接起因する問題だと思うので発生した文脈を明らかにするため「再現する最小限のコードを書いてみて、その全体を提示する」のがよいのですが・・・
考えてみると最小限の再現コードが書けるためにはある程度の「エラーの原因」が予想できることが前提になるかも知れません。文法に関する知識不足が課題の場合はコードを縮めること自体が難しいだろうと思います。質問者さん側にとってつらいところかも知れません。

そこで・・・ご質問のコード自体は大変短いものなので当たりはずれはさておき、敢えて「あり得る可能性」を上げてみます。

ひょっとして初めてクラス定義をしようとしてたりしませんか?

class MyClass:
    def bbb():
        return '戻り値'

    async def aaa():
        xxx = bbb()     # これでは参照できずNameErrorとなります

===>次のように書きます。

class MyClass:
    def bbb(self):
        return '戻り値'

    async def aaa(self):
        xxx = self.bbb()

もしくは

class MyClass:
    @staticmethod
    def bbb(self):
        return '戻り値'

    async def aaa(self):
        xxx = MyClass.bbb()

もしくは

class MyClass:
    @staticmethod
    def bbb():
        return '戻り値'

    async def aaa(self):
        xxx = MyClass.bbb()


NameErrorだとawait/asyncは無関係と判断したので上記はそれを除いて書いています。またaaaはインスタンスメソッドとしましたが、もちろんclassmethodにしたりstaticmethodとして定義できます。


Javaなど他の言語ではメソッドのレシーバーを明示的に引数には書きません。そういう言語に慣れていた自分はPythonのクラス定義をする際によくselfを付け忘れて書こうとしたりしてました。それを思い出してあえて「初めてクラス定義をしようとしている」と想定してみたのですが・・・少々苦しい想定だったかも知れません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

https://ideone.com/ytV6mc

await されないという警告が出ていますが NameError ではありませんね。

こちらでコードを補っていますが、補わなくても実行できて問題が再現する最小のコードを作って質問を書き換えてください。

と言うと何故か怒る質問者が多くて話にならないのですが、質問者と回答者で違うものを見ていたのではそれこそ話になりません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

別ファイルにしたいと言うことなら、importして下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/18 06:26

    別のファイルではないです

    キャンセル

  • 2018/01/18 07:33

    では、質問のエラーが再現するソースを貼って下さい。

    キャンセル

  • 2018/01/18 10:39

    そこに書いてあるとおりです

    キャンセル

  • 2018/01/18 13:55

    KSwordOfHaste さんの推測がビンゴということは、そこに書いてあるとおりではなかったわけです。
    インデントが無意味に深いので奇妙には思いましたが、そこまで思い至りませんでした。
    肝心なところを隠す意味がどこにあるのかさっぱりわかりません。

    キャンセル

  • 2018/01/18 14:03

    数万行のコードを全て載せるわけにはいきませんので

    キャンセル

  • 2018/01/18 14:06

    一つのクラスで数万行書いているというのがびっくりですが、数万行も要りません。
    クラスのメンバということを隠す意味がわからない、そしてそこに書いてあるとおりでないのにその一言で済ませる意味がわからないということです。

    キャンセル

  • 2018/01/18 14:07

    既存のシステムの修正なので

    キャンセル

  • 2018/01/18 14:08 編集

    このコメントは不適切な言葉でしたので修正して撤回します。

    キャンセル

  • 2018/01/18 14:09

    会社ではありません

    キャンセル

  • 2018/01/18 14:35

    KSwordOfHasteさんには、高評価の他に超能力者のバッチを差し上げたいところです。

    キャンセル

  • 2018/01/18 14:37

    本当ですね。素晴らしいです。

    キャンセル

  • 2018/01/18 15:08

    無駄な書き込みは不要です

    キャンセル

  • 2018/01/18 15:11

    誰でしたっけ?

    キャンセル

  • 2018/01/18 15:22

    あ、思い出したので無駄な自己紹介は不要です。
    作業に戻ってください。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    6448questions

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