我们from module import function称之为FMIF编码风格.
我们import module称之为IM编码风格.
我们from package import module称之为FPIM编码风格.
为什么IM + FPIM被认为是比FMIF更好的编码风格?(请参阅此帖子以获取此问题的灵感.)
以下是一些让我更喜欢FMIF而非IM的标准:
chisquare(...)看起来比可读性更强 scipy.stats.stats.chisquare(...).虽然这是一个主观标准,但我认为大多数人会同意.
function从alt_module不是module我需要改变只有一条线路:from alt_module import function.如果我使用IM,我需要更改许多行代码.
我对IM + FPIM可能比FMIF更好的所有原因感兴趣,但特别是,我有兴趣详细说明这里提到的以下几点:
IM的优点:
非常感谢.
这是一个经常以不同形式提出的问题,并经常得到"大声笑你没有做好"的回答.很确定这是因为人们(包括我)有一个常识场景试图用作实现,解决方案并不明显(如果你之前没有这样做过).
会接受一个"让飞出瓶子"的答案.
特定
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)似乎是首选.
在任何情况下,下面的陈述推荐一个首选的解决方案将消除我自己的"不自然"的感觉.
我可能遗漏了一些显而易见的东西但无论如何
当您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)
我究竟做错了什么?
如何检查代码中某处是否导入了模块?
if not has_imported("sys"):
print 'you have not imported sys'
Run Code Online (Sandbox Code Playgroud)
我想检查我是否已经导入模块的原因是因为我有一个我不想导入的模块,因为有时它会弄乱我的程序.
假设我有一个包含以下内容的模块:
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的新手,因为我想扩展我使用R学习的技能.在RI中,往往会加载一堆库,有时会导致函数名称冲突.
什么是Python的最佳实践.我看到一些具体的变化,我没有看到它们之间的区别
import pandas,from pandas import *和 from pandas import DataFrame
前两个之间有什么区别,我应该只输入我需要的东西.此外,对于制作小程序来处理数据和计算简单统计数据的人来说,最糟糕的后果是什么.
UPDATE
我找到了这个出色的指南.它解释了一切.
假设我有一个相对较长的模块,但只需要一次外部模块或方法.
在模块中间导入该方法或模块是否可以?
或者应该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或相关来源的链接
在驻留在包内的模块中,我需要使用在该__init__.py包内定义的函数.我如何在包内的模块中导入包,所以我可以使用该功能?
__init__在模块内导入不会导入包,而是导入一个名为的模块__init__,导致两个具有不同名称的东西副本...
有没有pythonic方式来做到这一点?
当我开始金字塔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) 我正在尝试导入这些:
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 ×10
python-import ×10
testing ×2
coding-style ×1
keras ×1
mocking ×1
module ×1
nose ×1
package ×1
unit-testing ×1
workflow ×1