60695


PyTorch のサンプルコードを読んで思った疑問です。PyTorchのサンプルには

[code]

    import torch
    import torch.nn as nn
    # ...
    
[/code]

などと書かれていることが多いです。しかし、 `torch.nn` という修飾子が長いので `nn` という名前を付けているだけなら、

[code]

    import torch
    from torch import nn
    
[/code]

と書けば良いだけなように思います。

from を使わない理由がわたしには思いつきませんでした。`import foo.bar as bar` と `from foo import bar`
になにか動作の違いはあるのでしょうか。それとも単に好みの問題でしょうか。


CC BY-SA 4.0
2019-11-20T03:40:12.057
60676
2019-11-20T23:48:01.123
27724
question
python
import foo.bar as barとfrom foo import barに違いはあるのか


[pep8-ja 1.0 ドキュメント](https://pep8-ja.readthedocs.io/ja/latest/)を見ると、

[code]

    from myclass import MyClass
    from foo.bar.yourclass import YourClass
    
[/code]

の書き方で名前の衝突がある場合は、次のように明示的にimportするとの記述がありました。

[code]

    import myclass
    import foo.bar.yourclass
    
[/code]

どのような場合に名前の衝突が起こるのかは私には分かりませんが、仕事でPythonを使う場合は名前の衝突のリスクを避けて、２番目の書き方に統一すると思います。

* * *

この質問に回答したときは

[code]

    import torch.nn
    
[/code]

と

[code]

    from torch import nn
    
[/code]

の違いの話だと思っていました。

※ `as bar`を見過ごしていました。  
`import torch.nn`の方は`nn`として使えないため、`from torch import nn`に合わせるため`as
nn`を付けたのだと思いました。

先の回答では「どうして名前の衝突が起こるのか」がわからなかったので考えてみました。

【名前の衝突が起こるケース】  
パッケージ`XX`に`YY`があり、別のパッケージ`XX2`にも`YY`があって、両方の`YY`を使いたいとき、`from XX import
YY`と`from XX2 import YY`は並び立たない。  
`from XX import YY`と`import XX2.YY`と書く必要がある。または`from XX2 import YY`と`import
XX.YY`。

* * *

仕事で使うときは、書式を統一したいので、インポートするときは`from XX import YY`ではなく`import
XX.YY`の形式で書いた方がよいと思います。

プライベートのときは、エラーが出なければどちらでもよいと思います。  
参考にするコードがあればそちらを尊重します。

直観的には  
`from torch import nn`は`import nn from torch` の方が分かりやすかったと思います。


CC BY-SA 4.0
2019-11-20T03:57:00.100
60677
2019-11-20T23:48:01.123
2019-11-20T23:48:01.123
35558
35558
60676
answer


違いがある場合の一例としては以下の様なものがあります。

[code]

    $ python3
    Python 3.7.5rc1 (default, Oct  8 2019, 16:47:45) 
    [GCC 9.2.1 20191008] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> import os.getcwd as getcwd
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'os.getcwd'; 'os' is not a package
    >>> from os import getcwd
    >>> getcwd()
    '/home/nemo'
    
[/code]

エラーメッセージにある通り、`os.getcwd()` はメソッドであってパッケージではないからです。  
一方、`os.path` などはパッケージですので `import foo.bar as bar` 形式でインポート可能です。

[code]

    >>> import os.path as path
    >>> path
    <module 'posixpath' from '/usr/lib/python3.7/posixpath.py'>
    
[/code]


CC BY-SA 4.0
2019-11-20T08:32:25.683
60695
2019-11-20T08:32:25.683
60676
answer