好吧,我只是试着看看变量范围如何工作并在以下情况下运行.全部从终端跑:
x = 1
def inc():
x += 5
inc()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in inc
UnboundLocalError: local variable 'x' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
所以我思考得很好也许我的方法无法访问x,所以我尝试了:
def inc():
print(x)
1
Run Code Online (Sandbox Code Playgroud)
这样可行.现在我知道我可以这样做:
def inc():
global x
x += 1
Run Code Online (Sandbox Code Playgroud)
这会奏效.但我的问题是为什么第一个例子失败了.我的意思是我希望自从print(x)
工作以来x在函数内可见,那么为什么x + = 5失败?
我遇到了一个奇怪的情况.我正在为我的程序编写一些测试用例.根据喜好,该程序可编写为sqllite或postgresqul.现在我正在使用unittest编写测试代码.基本上我正在做的事情:
def setUp(self):
"""
Reset the database before each test.
"""
if os.path.exists(root_storage):
shutil.rmtree(root_storage)
reset_database()
initialize_startup()
self.project_service = ProjectService()
self.structure_helper = FilesHelper()
user = model.User("test_user", "test_pass", "test_mail@tvb.org",
True, "user")
self.test_user = dao.store_entity(user)
Run Code Online (Sandbox Code Playgroud)
在setUp我删除任何存在的文件夹(由一些测试创建)然后我重置我的数据库(基本上删除表级联)然后我再次初始化数据库并创建一些将用于测试的服务.
def tearDown(self):
"""
Remove project folders and clean up database.
"""
created_projects = dao.get_projects_for_user(self.test_user.id)
for project in created_projects:
self.structure_helper.remove_project_structure(project.name)
reset_database()
Run Code Online (Sandbox Code Playgroud)
除了创建服务之外,拆除做同样的事情,因为这个测试模块是与其他模块相同的套件的一部分,我不希望某些测试留下一些东西.
现在我用sqllite测试了所有测试.使用postgresql我遇到了一个非常奇怪的情况:在执行中的某个时刻,实际上不同于运行到一小部分运行(一个或两个额外的调用),程序就停止了.我的意思是没有生成错误,没有抛出异常,程序就停止了.
现在我唯一可以想到的是,不知怎的,我忘记了在某个地方打开的连接,在我超时之后发生了一些事情.但是我有很多联系,所以在我开始讨论所有代码之前,我会很感激一些建议/意见.
什么可能导致这种行为?从哪里开始寻找?
此致,波格丹
好的,所以我真的想要做到这一点,因为我在生成一些大的py2app/py2exe包时会继续遇到它.所以我的包中包含很多模块/包,这些模块/包也可能在用户站点包/默认位置(如果用户有python发行版)但我希望我的分布式包在从我的发行版运行时生效.
现在从我在这里 读到的PYTHONPATH应该是当前目录之后添加到sys.path的第一件事,但是我在我的机器上测试的情况并非如此,所有定义的文件夹$site-packages$/easy-install.pth
优先于此.
那么有人可以给我一些关于这个导入顺序的更深入的解释//帮我找到一种方法来设置环境变量,使我分发的包优先于默认安装的包.到目前为止,我的尝试是,例如在Mac-OS py2app上,在我的入口点脚本中:
os.environ['PYTHONPATH'] = DATA_PATH + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH
, 'lib') + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
DATA_PATH, 'lib', 'python2.7', 'site-packages.zip')
Run Code Online (Sandbox Code Playgroud)
这基本上是py2app生成的包的结构.那我就是:
SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver'
, cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT],
shell=False, stdin=IN_FILE, stdout=OUT_FILE,
stderr=ERR_FILE)
Run Code Online (Sandbox Code Playgroud)
这里PYTHON_EXE_PATH是由py2app添加到包的python exe的路径.现在,这在没有安装python的机器上运行良好.但是,当python发布已经存在时,它们的站点包优先.
我有一个以下形式的字典:
{ <Category('Simulate', 'False', 'False', 'False', 'INTERMEDIATE')>: {'link': u'/story/4/tvb-adapters-simulator-simulatorAdapter/SimulatorAdapter', 'name': u'Simulate'},
<Category('View Results', 'True', 'False', 'True', 'INTERMEDIATE')>: {'link': '/story/step/3', 'name': u'View Results'},
<Category('Analyze', 'True', 'False', 'False', 'FINAL')>: {'link': '/story/step/2', 'name': u'Analyze'}}
Run Code Online (Sandbox Code Playgroud)
Category是表示数据库中的实例的类.现在我有以下实例:
<Category('Analyze', 'True', 'False', 'False', 'FINAL')>
Run Code Online (Sandbox Code Playgroud)
现在这不是同一个实例.我的意思是,我从数据库中获取所有值并创建字典.然后过了一会儿我得到一个id并从数据库中检索实例.现在他们不是同一个对象.我现在必须检查它是否在字典中,但是:
instance in disctionary
Run Code Online (Sandbox Code Playgroud)
将返回false.现在我可以采用丑陋的方式迭代字典检查所有值是否匹配,但是Python有更聪明的方法吗?我的意思是类似于Java中的Comparable?
好的,所以我仍然在努力让这个工作.我的代码的重要部分是:
def __init__(self, vertices, normals, triangles):
self.bufferVertices = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB)
self.vertices = vertices
self.bufferNormals = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB)
self.normals = normals
self.bufferTriangles = glGenBuffersARB(1)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
self.triangles = triangles
glDisableClientState(GL_VERTEX_ARRAY) **(Not sure if any of the following influence in any way)**
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
Run Code Online (Sandbox Code Playgroud)
从目前为止我读到的关于VBO的内容来看,我认为这里没有任何错误.所以现在我有我的顶点,法线(尚未使用)和三角形索引缓冲区.现在进行实际抽奖:
def draw(self, type):
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
**Again above line not sure if they have any use.**
glEnableClientState(GL_VERTEX_ARRAY) …
Run Code Online (Sandbox Code Playgroud) 我正在使用Python 2.7开发我的第一个项目.我们来自Java背景,我们的第一直觉是以Java式方式编写python代码.但现在我们正在努力尽可能地适应.到目前为止,我们正在使用pylint来调整我们的代码.
现在我一直在遇到pylint的情况.我每次使用类似**data
将值传递给方法,我得到一个pylint的警告有关使用*
或**
.现在我的问题是:使用**
不好的样式来编写python代码?使用它有什么标准替代品吗?
此致,波格丹
所以我在python中知道一切都是'对象',这意味着它可以作为参数传递给方法.但我试图了解这是如何工作的.所以我尝试了以下示例:
class A:
def __init__(self):
self.value = 'a'
def my_method(self)
print self.value
class B:
def __init__(self):
self.values = 'b'
def my_method(self, method):
method()
a = A()
b = B()
b.my_method(a.my_method)
Run Code Online (Sandbox Code Playgroud)
现在首先写这篇文章只是为了看看事情是如何运作的.我知道我应该检查一下my_method
这个参数是否可以调用.现在我的问题是:
这个方法到底是怎么回事?我的意思是我收到的输出是'a'所以我猜测当一个对象方法作为参数传递时,实际对象是什么?在这种情况下我传递a.my_method
的实例a
也通过了吗?
我们正在尝试配置我们的第一个"服务器",我们希望maven3可以使用它.到目前为止,我们已经安装了一个带有工作svn的debian squeeze.现在对于maven3部分,我一直在谷歌搜索关于在squeeze上安装/配置的教程,但到目前为止我发现的是:
Maven 3.x is still in beta stage [1] and Debian Squeeze 6.0 is now frozen so
it may not be a high priority package.
If someone have enough time to package this (ie. based on maven2 package + all
new runtime dependencies), maybe we can upload it to experimental archive.
Run Code Online (Sandbox Code Playgroud)
那么这是否意味着我们将不得不推迟这个并暂时使用maven2或者我们仍然可以尝试获得maven3?
好的,我正在尝试使用 py2app 为我的项目生成发行版。我仍然不确定我是否掌握了它的窍门。所以我的 setup.py 看起来像这样:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
import setuptools
PACKAGES = ['sqlalchemy.dialects.sqlite']
MODULES = ['sqlite3']
APP = ['tvb/interfaces/web/run.py']
OPTIONS = {'argv_emulation': True,
'packages': PACKAGES ,
'includes' : MODULES }
DATA_FILES = []
setup(
app=APP,
data_files=DATA_FILES,
packages = setuptools.find_packages(),
include_package_data=True,
options={'py2app': OPTIONS},
setup_requires=['py2app', "pyopengl", "cherrypy", "sqlalchemy", "simplejson",
"formencode", "genshi", "quantities","numpy", "scipy",
"numexpr", "nibabel", "cfflib", "mdp", "apscheduler",
"scikits.learn"]
)
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是:我应该在 py2app 的模块中包含什么?py2app 是否知道扫描 setup_requires 中的内容并包含它们,或者我是否需要在 MODULES …
我正在尝试编写一个自定义过滤器来检索然后在模板中使用的对象列表。到目前为止我已经得到:
@register.filter
def get_my_object_list(user):
return some list after processing
Run Code Online (Sandbox Code Playgroud)
并在模板中:
{% for page in request.user|get_pages_with_no_menu %}
Some rendering here.
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
现在这工作正常,这可能听起来很愚蠢,但我找不到解决方案。我真的不需要该过滤器中的用户,所以我不想有任何参数。这可能吗?如何从模板中调用它?
谢谢
python ×7
coding-style ×1
debian ×1
django ×1
maven-3 ×1
opengl ×1
py2app ×1
pylint ×1
pyopengl ×1
sqlalchemy ×1