import foo.bar as barとfrom foo import barに違いはあるのか


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`
になにか動作の違いはあるのでしょうか。それとも単に好みの問題でしょうか。




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

[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]




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

[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]

