Pythonのチュートリアル:どのくらいの期間は、Pythonを学ぶのですか?あなたはそれを学ぶ何かどれですか?

Pythonのチュートリアル:どのくらいの期間は、Pythonを学ぶのですか?あなたはそれを学ぶ何かどれですか?

あなたが初心者のPythonプログラマであれば、あなたが最初に学ぶ必要がある要素の一つは、モジュールやパッケージをインポートする方法です。しかし、私は何年もの間、随時パイソンを使用する人々は、Pythonのインポートメカニズムは実際には非常に柔軟性があるか分からないことに気づきました。この記事では、我々は次のトピックについて説明します。

  • 一般インポート(正規輸入)
  • からインポートするステートメントを使用します
  • 逆の(相対輸入)を導入
  • オプションの紹介(オプション輸入)
  • ローカル導入(現地輸入)
  • インポートの注意事項

一般インポート

インポートする一般的な輸入は、最も一般的な方法でこのようなものを使用する必要があります。

import sys
复制代码

あなただけの単語のインポートを使用して、インポートするモジュールやパッケージを指定する必要があります。このようにして導入のメリットは、使い捨てのパッケージまたは複数のモジュールに導入されています。

import os, sys, time
复制代码

これは、Pythonのスタイルガイドにスペースが、反対を節約しながら。Pythonのスタイルガイドは別々のライン上の各import文することをお勧めします。

あなたはモジュールをインポートするときに時々、あなたは、このモジュールの名前を変更したいです。この機能は、実装が容易です:

import sys as system
print(system.platform)
复制代码

我々上記のコードは、sysは、モジュールという名前のシステムの名前を変更インポートします。私たちは、さまざまな方法に従ってモジュールを呼び出すと、新しいモジュール名を持つ前と同じことを意味することができます。インポートするには、ドット表記を使用する必要がありますいくつかのサブモジュールもあります。

import urllib.error
复制代码

この状況は一般的ではありませんが、常に害しないについて何かを知っています。

からインポートするステートメントを使用します

何度もあなただけのモジュールまたはライブラリの一部をインポートしたいです。私たちは、Pythonでこれを実現する方法を見て:

from functools import lru_cache
复制代码

あなたが直接lrucache呼び出すことができます上記のコード行。あなたはfunctoolsに通常の方法をインポートする場合は、このようlrucache呼び出す必要があります:

functools.lru_cache(*args)
复制代码

実際にご使用のシナリオに応じて、上記のアプローチが良いかもしれません。機能が有用であるインポートされた時点から見ることができる複雑なコードベース、で。あなたのコードがよく維持されている場合は、モジュール性の高い程度は、その後、モジュールの特定の部分からのみインポートすることも非常に簡単でシンプルです。

もちろん、あなたもこのように、モジュールからコンテンツをインポートするすべてのメソッドを使用することができます。

from os import *
复制代码

いくつかのケースではこのような行為は非常に便利ですが、それはまたあなたの名前空間を破壊します。問題は、あなたが同じ名前のosモジュールの変数や関数を使用しようとすると、その後、独自の定義の内容を実際に使用されます、変数や関数と同じ名前のインポートモジュールを定義するかもしれません、です。そのため、あなたは非常に最後の人々に混乱し、論理エラーが発生することがあります。私の唯一の標準ライブラリモジュールは、全体的な輸入のTkinterをお勧めします。

あなただけの独自のモジュールやパッケージを書きたい場合は、誰かがあなたが使用しやすいモジュールやパッケージを与え、_init_.pyファイル内のすべてをインポートし提案します。私は個人的には、暗黙的にインポートされたのではなく、ディスプレイをインポートすることを好みます。

また、パッケージから複数の項目をインポートするために妥協を取ることができます。

from os import path, walk, unlink
from os import uname, remove
复制代码

上記のコードでは、osモジュールからの5つの機能を導入しました。あなたは私たちが達成するために、同じモジュールからの複数の輸入を通じてあり、気づいたかもしれません。ご希望の場合はもちろん、あなたはまた、複数の使い捨てのアイテムをインポートするために括弧を使用することができます。

from os import (path, walk, unlink, uname, remove, rename)
复制代码

これは有用な技術であるが、あなたはまた、別の言い方をすることができます:

from os import path, walk, unlink, uname, remove, rename
复制代码

バックスラッシュは、行は、それが次の行に続けインタプリタを伝える、Pythonの行継続文字の上にあります。

相対輸入

PEP 328は、相対的輸入の導入のための理由を説明し、かつ構文を選択しました。具体的には、他のパッケージやモジュールをインポートする期間の相対的な使用方法を決定することです。この理由は、標準ライブラリモジュールケース時折競合を導入することを避けるためにです。ここでは、相対的な輸入を見て、一例として、PEP 328にフォルダ構造にファイルを与えるそれがどのように動作するかです:

my_package/
 __init__.py
 subpackage1/
 __init__.py
 module_x.py
 module_y.py
 subpackage2/
 __init__.py
 module_z.py
 module_a.py
复制代码

ローカルディスク上に上記のファイルやフォルダを作成する場所を探します。トップ_init_.pyファイルで、次のコードを入力します。

from . import subpackage1
from . import subpackage2
复制代码

次に、subpackage1フォルダを入力し、それらを_init_.pyファイルを編集し、次のコードを入力します。

from . import module_x
from . import module_y
复制代码

今module_x.pyファイルを編集し、次のコードを入力します。

from .module_y import spam as ham
def main():
 ham()
复制代码

最後に編集しmodule_y.pyファイルには、次のコードを入力します。

def spam():
 print('spam ' * 3)
复制代码

、ターミナルを開き、ファイルmypackageとパッケージフォルダにcdが、mypackageとを入力しないでください。このフォルダには、Pythonインタプリタを実行します。そのオートコンプリート機能は非常に便利であるのので、私は、IPythonを使用しています:

In [1]: import my_package
In [2]: my_package.subpackage1.module_x
Out[2]: <module 'my_package.subpackage1.module_x' from 'my_package/subpackage1/module_x.py'>
In [3]: my_package.subpackage1.module_x.main()
spam spam spam
复制代码

相対インポートは、最終的にパッケージ内のコードを配置する必要があなたに適用されます。あなたは強い相関コードの多くを書く場合は、このインポートモードを使用する必要があります。あなたは多くの人気のあるパッケージには、は、PyPI上の相対的な輸入品を使用しています。また、複数のファイル間でのレベルをインポートしたい場合は、あなただけの複数の期間を使用する必要があることに注意してください。しかし、PEP 328は、2つ以下の層をインポートしないように相対的なレベルをお勧めします。

あなたがもしmodulex.pyファイルに_name__ ==「_main_」を追加して、このファイルを実行しようとした場合、あなたは理解することは困難であるエラーが発生しますも注意してください。ファイルのエディタは、それを試してみます!

from . module_y import spam as ham
def main():
 ham()
if __name__ == '__main__':
 # This won't work!
 main()
复制代码

端末はsubpackage1フォルダに入るから、今、次のコマンドを実行します。

python module_x.py
复制代码

あなたがPythonの2を使用している場合、次のエラーメッセージが表示されます。

Traceback (most recent call last):
 File "module_x.py", line 1, in <module>
 from . module_y import spam as ham
ValueError: Attempted relative import in non-package
复制代码

:あなたは、Python 3に、このようなエラーメッセージが何かを使用している場合

Traceback (most recent call last):
 File "module_x.py", line 1, in <module>
 from . module_y import spam as ham
SystemError: Parent module '' not loaded, cannot perform relative import
复制代码

これはmodule_x.pyは、パッケージのモジュールである、ということを意味し、あなたはスクリプトモードを実行しようとしますが、このモードでは、相対インポートをサポートしていません。

あなたがあなた自身のコード内でこのモジュールを使用したい場合、あなたは、Python(インポート検索パス)のパスを取得インポートし、それを追加する必要があります。次のように最も簡単な方法は、次のとおりです。

import sys
sys.path.append('/path/to/folder/containing/my_package')
import my_package
复制代码

あなたの代わりに自分自身をmypackageとフォルダ1パスのmypackageとで追加する必要があることに注意してください。その理由は、我々はあなたがそのパスを追加しますので、もし、このパッケージを使用することはできません、my_packageパッケージを使用したいということです。

私たちは、次の代替輸入に頼ります。

また導入(オプション輸入)

あなたが優先順位モジュールまたはパックを使用したいが、また、このモジュールまたはパック例不在下での代替を持っているしたい場合は、オプションのインポートにこの方法を使用することができます。そうすることでソフトウェアの複数のバージョンをインポートしたり、パフォーマンスの向上を実現するためにサポートすることができます。例としてgithub2パッケージコードで:

try:
 # For Python 3
 from http.client import responses
except ImportError: # For Python 2.5-2.7
 try:
 from httplib import responses # NOQA
 except ImportError: # For Python 2.4
 from BaseHTTPServer import BaseHTTPRequestHandler as _BHRH
 responses = dict([(k, v[0]) for k, v in _BHRH.responses.items()])
复制代码

lxmlのオプションパッケージもモードをインポートするために使用されています。

try:
 from urlparse import urljoin
 from urllib2 import urlopen
except ImportError:
 # Python 3
 from urllib.parse import urljoin
 from urllib.request import urlopen
复制代码

上記の例に示すように、オプションのインポートを使用することは、マスターにふさわしい技術であり、非常に一般的です。

ローカル配信

あなたは、ドメイン内のローカルインポートモジュールの役割である場合、あなたはそれを行う現地の輸入です。スクリプトファイルの先頭にPythonモジュールをインポートする場合は、任意の関数やメソッドは、以下のモジュールにアクセスする可能性があることを意味モジュール内のグローバルスコープに導入されています。例えば:

import sys # global scope
def square_root(a):
 # This import is into the square_root functions local scope
 import math
 return math.sqrt(a)
def my_pow(base_num, power):
 return math.pow(base_num, power)
if __name__ == '__main__':
 print(square_root(49))
 print(my_pow(2, 3))
复制代码

ここでは、グローバルスコープにSYSモジュールをインポートしますが、我々は、このモジュールを使用していませんでした。次に、平方根関数の中で、私たちは数学モジュールは平方根関数内のみを使用することができることを意味し、関数のローカルスコープに数学のモジュールをインポートします。我々はmy_pow機能で数学を使用しようとすると、NameErrorを起こします。このスクリプトを実行すると何が起こるか見てみてください。

ローカルスコープを使用する利点の1つは、インポートに使用モジュールは、グローバルスコープに直接ではなく、おそらくより合理的ではない、常にあるその場合は、関数呼び出しに置き、長い時間がかかることがありますインポート。正直なところ、私はimport文はモジュール内部であふれているならば、そうする理由を区別して使用することが困難になる主な理由は、地元のインポートを使用ことはほとんどありません。慣例により、すべてのimport文は、モジュールの上に配置する必要があります。

インポートの注意事項

インポートモジュールの面では、いくつかのプログラマはしばしば間違いを犯すがあります。ここでは、2をご紹介します。

  • はじめにサイクル(円形輸入)
  • 輸入カバー(シャドウ輸入、一時的にカバー翻訳へのインポート)

のは、循環輸入を見てみましょう。

循環のインポート

次の2つのモジュールを作成した場合、お互いの両方の輸入は、その後、循環にあっ導入されます。例えば:

# a.py
import b
def a_test():
 print("in a_test")
 b.b_test()
a_test()
复制代码

次に、同じフォルダに名前を付け、別のモジュールを作成b.py.

import a
def b_test():
 print('In test_b"')
 a.a_test()
b_test()
复制代码

あなたはモジュールのいずれかを実行している場合、はAttributeErrorをリードします。これら二つは他のモジュールをインポートしようとしているためです。要するに、我々はモジュールをインポートするモジュールは、モジュールがインポートモジュールbを完了することができません、(その後に行われている)モジュールをインポートしようとしているので、B、モジュールBですが。これを防ぐためにコードをリファクタリングである私は、この問題を解決するためにクラック法(ハック)のいくつかを読んだが、一般的に、あなたが行う必要があります。

インポートカバレッジ

あなたは、ライブラリ内の標準モジュールと同じ名前のモジュールを作成するときは、モジュールをインポートする場合、それが輸入によってカバーされます。たとえば、コードは次のように書かれているmath.pyというファイルを作成します。

import math
def square_root(number):
 return math.sqrt(number)
square_root(72)
复制代码

今、あなたは、以下の情報(トレースバックを)取り戻すだろう、このファイルを実行しようと、ターミナルを開きます。

Traceback (most recent call last):
 File "math.py", line 1, in <module>
 import math
 File "/Users/michael/Desktop/math.py", line 6, in <module>
 square_root(72)
 File "/Users/michael/Desktop/math.py", line 4, in square_root
 return math.sqrt(number)
AttributeError: module 'math' has no attribute 'sqrt'
复制代码

これは最終的にそれがどのようにでしょうか?あなたはこのファイルを実行すると実際には、数学モジュールという名前のPythonインタプリタは、最初のフォルダにある現在のスクリプトファイル内を検索します。この例では、インタプリタは、我々はそれをインポートしようとするために実施しているモジュールを見つけました。しかし、我々は、モジュールおよびsqrtの機能や属性を呼び出していないので、私ははAttributeErrorを投げました。

概要

この記事では、コンテンツの多くを輸入について話しましたが、また、一部には関与していません。PEP 302はgithubのから直接インポートのようないくつかの非常にクールな機能をサポートするために、インポート・フック(インポートフック)を導入します。Pythonの標準ライブラリものimportlibモジュールを持って、それが見ることを学ぶ価値があります。



ます。https://juejin.im/post/5cf0cac0f265da1b6b1cbcc4で再現

おすすめ

転載: blog.csdn.net/weixin_34194702/article/details/91475729