标签: python-import

`import module`比`from module import function`更好的编码风格?

我们from module import function称之为FMIF编码风格.

我们import module称之为IM编码风格.

我们from package import module称之为FPIM编码风格.

为什么IM + FPIM被认为是比FMIF更好的编码风格?(请参阅此帖子以获取此问题的灵感.)

以下是一些让我更喜欢FMIF而非IM的标准:

  1. 代码简短:它允许我使用更短的函数名称,从而有助于坚持80行每行约定.
  2. 可读性:chisquare(...)看起来比可读性更强 scipy.stats.stats.chisquare(...).虽然这是一个主观标准,但我认为大多数人会同意.
  3. 缓解重定向:如果我使用FMIF出于某种原因,在一段时间后要重定向蟒蛇定义functionalt_module不是module我需要改变只有一条线路:from alt_module import function.如果我使用IM,我需要更改许多行代码.
我意识到FPIM在某种程度上取消了前两个问题,但是第三个呢?

我对IM + FPIM可能比FMIF更好的所有原因感兴趣,但特别是,我有兴趣详细说明这里提到的以下几点:

IM的优点:

  1. 易于模拟/注入测试.(我对嘲笑并不是很熟悉,虽然我最近了解了这个术语的含义.你能展示一下代码,它展示了IM在这里比FMIF更好吗?)
  2. 通过重新定义某些条目来灵活更改模块的能力.(我一定是误解了一些东西,因为这似乎是FMIF相对于IM的优势.请参阅我上面支持FMIF的第三个理由.)
  3. 序列化和恢复数据的可预测和可控行为.(我真的不明白IM或FMIF的选择如何影响这个问题.请详细说明.)
  4. 我理解FMIF"污染了我的命名空间",但除了是一个消极的说法之外,我不理解这会如何以任何具体的方式伤害代码.
PS.在写这个问题的时候,我收到一个警告,说这个问题似乎是主观的,可能会被关闭.请不要关闭它.我不是在寻找主观意见,而是寻找具体的编码情况,其中IM + FPIM明显优于FMIF.

非常感谢.

python python-import

67
推荐指数
4
解决办法
3974
查看次数

Python使用nose导入测试 - 对于当前包上面的模块导入,最佳做法是什么

这是一个经常以不同形式提出的问题,并经常得到"大声笑你没有做好"的回答.很确定这是因为人们(包括我)有一个常识场景试图用作实现,解决方案并不明显(如果你之前没有这样做过).

会接受一个"让飞出瓶子"的答案.

特定

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py
Run Code Online (Sandbox Code Playgroud)

tests_sut.py开始的位置:

import code.sut
Run Code Online (Sandbox Code Playgroud)

在根目录中运行nosetests会导致:

ImportError: No module named code.sut
Run Code Online (Sandbox Code Playgroud)

旅行途径:

a)做亲戚使用

from ..code import sut
Run Code Online (Sandbox Code Playgroud)

b)将项目的根添加到PYTHONPATH

c)使用

sys.path.append
Run Code Online (Sandbox Code Playgroud)

在每个测试模块的开头导入之前添加..路径.

d)只记得做一个

setup.py 
Run Code Online (Sandbox Code Playgroud)

在项目上,在运行测试之前将模块安装到站点包中.


因此,要求是在测试包根目录下面有可以访问项目的测试.上面的每一个对我来说都不觉得"自然",已经证明有问题或者看起来太辛苦了!

在java中这是有效的,但基本上是通过构建工具/ IDE将所有类放在类路径上.也许问题是我期待Python的"魔力"?在Flask webframework测试中已经注意到,选项d)似乎是首选.

在任何情况下,下面的陈述推荐一个首选的解决方案将消除我自己的"不自然"的感觉.

python testing nose python-import

64
推荐指数
3
解决办法
2万
查看次数

用Python导入包

我可能遗漏了一些显而易见的东西但无论如何

当您os在python中导入包时,您可以使用任何子模块/子包.例如,这有效:

>>> import os
>>> os.path.abspath(...)
Run Code Online (Sandbox Code Playgroud)

但是我有自己的包,其结构如下:

FooPackage/
  __init__.py
  foo.py
Run Code Online (Sandbox Code Playgroud)

这里相同的逻辑不起作用:

>>> import FooPackage
>>> FooPackage.foo
AttributeError: 'module' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

python python-import

63
推荐指数
4
解决办法
9万
查看次数

如何检查是否已导入python模块?

如何检查代码中某处是否导入了模块?

 if not has_imported("sys"):
     print 'you have not imported sys'
Run Code Online (Sandbox Code Playgroud)

我想检查我是否已经导入模块的原因是因为我有一个我不想导入的模块,因为有时它会弄乱我的程序.

python python-import

63
推荐指数
5
解决办法
5万
查看次数

如何测试或模拟"if __name__ =='__ main__'"内容

假设我有一个包含以下内容的模块:

def main():
    pass

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

我想为下半部分编写单元测试(我希望实现100%的覆盖率).我发现了runpy内置模块执行导入/ __name__设置机制,但我无法弄清楚如何模拟或以其他方式检查main()函数是否被调用.

这是我到目前为止所尝试的:

import runpy
import mock

@mock.patch('foobar.main')
def test_main(self, main):
    runpy.run_module('foobar', run_name='__main__')
    main.assert_called_once_with()
Run Code Online (Sandbox Code Playgroud)

python testing unit-testing mocking python-import

62
推荐指数
4
解决办法
2万
查看次数

用Python导入模块 - 最佳实践

我是Python的新手,因为我想扩展我使用R学习的技能.在RI中,往往会加载一堆库,有时会导致函数名称冲突.

什么是Python的最佳实践.我看到一些具体的变化,我没有看到它们之间的区别

import pandas,from pandas import *from pandas import DataFrame

前两个之间有什么区别,我应该只输入我需要的东西.此外,对于制作小程序来处理数据和计算简单统计数据的人来说,最糟糕的后果是什么.

UPDATE

我找到了这个出色的指南.它解释了一切.

python workflow coding-style python-import

59
推荐指数
5
解决办法
3万
查看次数

Python中的好或坏练习:在文件中间导入

假设我有一个相对较长的模块,但只需要一次外部模块或方法.

在模块中间导入该方法或模块是否可以?

或者应该import只在模块的第一部分.

例:

import string, pythis, pythat
...
...
...
...
def func():
     blah
     blah 
     blah
     from pysomething import foo
     foo()
     etc
     etc 
     etc
...
...
...
Run Code Online (Sandbox Code Playgroud)

请证明您的答案是合理的,并添加指向PEP或相关来源的链接

python python-import

58
推荐指数
7
解决办法
2万
查看次数

Python:导入包含的包

在驻留在包内的模块中,我需要使用在该__init__.py包内定义的函数.我如何在包内的模块中导入包,所以我可以使用该功能?

__init__在模块内导入不会导入包,而是导入一个名为的模块__init__,导致两个具有不同名称的东西副本...

有没有pythonic方式来做到这一点?

python module package python-import

57
推荐指数
3
解决办法
3万
查看次数

导入错误:'没有名为'*的模块*存在

当我开始金字塔pserve时,我得到了这个堆栈跟踪:

% python $(which pserve) ../etc/development.ini
Traceback (most recent call last):
  File "/home/hughdbrown/.local/bin/pserve", line 9, in <module>
    load_entry_point('pyramid==1.5', 'console_scripts', 'pserve')()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 51, in main
    return command.run()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 316, in run
    global_conf=vars)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 340, in loadapp
    return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 271, in loadobj
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 320, in _loadconfig
    return loader.get_context(object_type, name, …
Run Code Online (Sandbox Code Playgroud)

python python-import

52
推荐指数
5
解决办法
22万
查看次数

无法从“keras.preprocessing.sequence”导入名称“pad_sequences”

我正在尝试导入这些:

from numpy import array
from keras.preprocessing.text import one_hot

from keras.preprocessing.sequence import pad_sequences


from keras.models import Sequential
from keras.layers.core import Activation, Dropout, Dense
from keras.layers import Flatten, LSTM
from keras.layers import GlobalMaxPooling1D
from keras.models import Model
Run Code Online (Sandbox Code Playgroud)

但我收到错误,因为无法从“keras.preprocessing.sequence”导入名称“pad_sequences”

有人可以帮我吗?

python python-import keras

52
推荐指数
5
解决办法
11万
查看次数