小编kuz*_*roo的帖子

在OSX上调用python和Spyder的方法

我最近买了一台MacBook并通过Anaconda安装了Python.这是版本信息:

Python 2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Run Code Online (Sandbox Code Playgroud)

我希望能够做到以下所有方面:

  1. 启动Spyder而无需通过Launcher应用程序(例如,通过在Spotlight和Quicksilver中输入内容)
  2. 从Finder运行Python代码,可能是双击我的.py文件或选择并按下Cmd-O
  3. 通过在Quicksilver中键入Python脚本的名称来运行Python代码(就好像它是一个常规程序)

这是我尝试过的:

  1. (没有;这里没有想法)
  2. 我将.py文件与/Users/kuzzooroo/anaconda/python.app/Contents/MacOS/python相关联,并使它们可执行(chmod u + x).当我尝试运行应用程序永远不会启动,我没有收到错误消息(不知道在哪里看)
  3. 使文件可执行并尝试从Spotlight运行它们.与#2相同的结果.

这是我可以做的:

  • 如果我在顶部有正确的shebang并且使文件可执行,则从终端窗口运行我的代码
  • 使用py2app生成应用程序.不幸的是,这种方法存在以下缺点:
    • 我经常修改我的脚本,并且不希望每次都运行py2app
    • 即使对于一个简单的脚本,生成的应用程序是7 MB
    • 要在某些上下文中运行应用程序,我必须在bundle中搜索实际的"Unix可执行文件"并运行它

一旦我有了这个工作,我就有兴趣做以下事情:
A.控制哪些脚本在运行时创建一个控制台窗口而哪些脚本没有
B.控制在脚本完成或等待用户时生成的控制台窗口是否消失(我)关闭它
然而,我怀疑一旦我弄清楚如何首先调用我的脚本,可能很容易弄清楚如何做这些(或者是否可能).

python macos finder spyder anaconda

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

如果我没有跟踪进入的所有数据点,则将y = x添加到matplotlib散点图中

这里有一些代码使用matplotlib散布了许多不同系列的图,然后添加了行y = x:

import numpy as np, matplotlib.pyplot as plt, matplotlib.cm as cm, pylab

nseries = 10
colors = cm.rainbow(np.linspace(0, 1, nseries))

all_x = []
all_y = []
for i in range(nseries):
    x = np.random.random(12)+i/10.0
    y = np.random.random(12)+i/5.0
    plt.scatter(x, y, color=colors[i])
    all_x.extend(x)
    all_y.extend(y)

# Could I somehow do the next part (add identity_line) if I haven't been keeping track of all the x and y values I've seen?
identity_line = np.linspace(max(min(all_x), min(all_y)),
                            min(max(all_x), max(all_y)))
plt.plot(identity_line, identity_line, color="black", linestyle="dashed", linewidth=3.0)

plt.show() …
Run Code Online (Sandbox Code Playgroud)

python plot matplotlib scatter-plot

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


Python中的照应列表理解

考虑以下玩具示例:

>>> def square(x): return x*x
... 
>>> [square(x) for x in range(12) if square(x) > 50]
[64, 81, 100, 121]
Run Code Online (Sandbox Code Playgroud)

我必须在列表理解中两次调用square(x).重复是丑陋的,容易出错(修改代码时只能更改两个调用中的一个),并且效率低下.

我当然可以这样做:

>>> squares = [square(x) for x in range(12)]
>>> [s for s in squares if s > 50]
[64, 81, 100, 121]
Run Code Online (Sandbox Code Playgroud)

或这个:

[s for s in [square(x) for x in range(12)] if s > 50]
Run Code Online (Sandbox Code Playgroud)

这些都是宜居的,但感觉似乎有一种方法可以在一个语句中完成所有操作,而不需要嵌套两个列表推导,我知道下次我在阅读时我将不得不盯着它看一段时间代码只是为了弄清楚发生了什么.有办法吗?

我认为一个可以问我的公平问题是我想象的这样的语法可能是什么样的.这里有两个想法,但在Python中都不是惯用的(它们也不起作用).它们的灵感来自Lisp中照应宏.

[square(x) for x in range(12) if it > 50]
[it=square(x) for x in range(12) if …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension

12
推荐指数
3
解决办法
1305
查看次数

复制文件,但不要覆盖,没有Python中的TOCTTOU问题

我知道如果我想用Python复制文件而不是覆盖目标,我可以使用这样的代码:

if os.path.exists(dest):
    raise Exception("Destination file exists!")
else:
    shutil.copy2(src, dest)
Run Code Online (Sandbox Code Playgroud)

但是,在我打电话os.path.exists和打电话的时间之间,世界状况可能会发生变化copy2.是否有更优选的方式进行复制而不进行覆盖,大概是如果目标已经存在,复制操作会引发异常?

python shutil race-condition

9
推荐指数
1
解决办法
4996
查看次数

为什么Python装饰器的参数在语法上与没有参数的参数不同?

本文从各种stackoverflow问题中多次链接,描述了带参数的装饰器在语法上与不带参数的装饰器的区别.

  • 没有参数的装饰器:"请注意,这__init__()是执行装饰的唯一方法,__call__()每次调用装饰时都会调用它sayHello()."
  • 带参数的装饰器:"现在装饰过程调用构造函数,然后立即调用__call__(),只能接受一个参数(函数对象),并且必须返回替换原始的装饰函数对象.请注意,__call__()现在只调用一次,在装修期间,之后您返回的装饰功能将__call__()用于实际通话."

文章中给出的解释并没有告诉我为什么语言是这样建立的:

虽然这种行为是有道理的 - 构造函数现在用于捕获装饰器参数,但该对象__call__()不能再用作装饰函数调用,因此您必须使用它__call__()来执行装饰 - 它仍然是令人惊讶的第一次你看到了

此设置有两个相关功能让我感到不舒服:

  1. 为什么提供一种方法来制作无参数装饰器,这不仅仅是指定装饰器的更通用方法的特例?为什么使用__init____call__在这两个,但他们意味着不同的事情?
  2. 为什么__call__在具有参数的装饰器的情况下使用除了调用装饰函数之外的其他目的(顾名思义,至少来自无参数情况)?由于__call__只有后立即调用__init__,为什么不直接传递给装饰作为参数传递给函数__init__和处理,将在发生一切__call____init__呢?

python arguments callable decorator

8
推荐指数
1
解决办法
965
查看次数

在Python中调用getLogger之前,是否需要显式检查__name__ =="__ main__"?

我相信使用Python的内置日志记录模块logger使主模块中的根记录器成为标准做法.假设这是正确的,在我看来,对于任何可能或可能不作为main运行的模块,我需要明确检查.原因是,如果我遵循标准的调用方法,logging.getLogger(__name__)我会得到一个名为logger __main__而不是根记录器:

import logging
print logging.getLogger().name # root
print logging.getLogger(__name__).name # __main__
Run Code Online (Sandbox Code Playgroud)

总是要检查最佳做法吗?

if __name__ == "__main__":
    logger = logging.getLogger()
else:
    logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

这并不是那么糟糕,因为我总是会有其他代码只运行if __name__ == "__main__"(通常包括调用logging.basicConfig),但是只需要一行而不是更多就很好.

python logging

8
推荐指数
1
解决办法
1028
查看次数

暂时在Python中更改变量的值

Python 3.4提供了这个简洁的工具来暂时重定向stdout:

# From https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout
with redirect_stdout(sys.stderr):
    help(pow)
Run Code Online (Sandbox Code Playgroud)

代码并不是非常复杂,但我不想一遍又一遍地写它,特别是因为有些想法已经进入它以使它重新进入:

class redirect_stdout:
    def __init__(self, new_target):
        self._new_target = new_target
        # We use a list of old targets to make this CM re-entrant
        self._old_targets = []

    def __enter__(self):
        self._old_targets.append(sys.stdout)
        sys.stdout = self._new_target
        return self._new_target

    def __exit__(self, exctype, excinst, exctb):
        sys.stdout = self._old_targets.pop()
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一般方法使用该with语句来临时更改变量的值.从另外两个用例syssys.stderrsys.excepthook.

在一个完美的世界中,这样的东西会起作用:

foo = 10
with 20 as foo:
    print(foo) # 20
print (foo) # 10
Run Code Online (Sandbox Code Playgroud)

我怀疑我们能做到这一点,但也许这样的事情是可能的:

foo = 10
with temporary_set('foo', …
Run Code Online (Sandbox Code Playgroud)

python with-statement contextmanager

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

编写一个只能用作上下文管理器的Python类

有没有办法在Python中编写一个会出错的类,除非它与with语句一起使用?

# Okay:
with Foo() as f1:
    f1.func1()
    f1.func2()

# Not okay:
f2 = Foo()
f2.func1()
Run Code Online (Sandbox Code Playgroud)

我可以手动完成:__enter__设置一个标志并让其他方法检查该标志.但有更好的方法吗?

以下是不那么自然的代码:

class Foo(object):
    def __init__(self):
        self._entered = False

    def __enter__(self):
        self._entered = True
        return self

    def _verify_entered(self):
        if not self._entered:
            raise Exception("Didn't get call to __enter__")

    def __exit__(self, typ, val, traceback):
        self._verify_entered()
        print("In __exit__")

    def func1(self):
        self._verify_entered()
        # do stuff ...

    def func2(self):
        self._verify_entered()
        # do other stuff
Run Code Online (Sandbox Code Playgroud)

python contextmanager

7
推荐指数
1
解决办法
706
查看次数

像Python一样格式化异常

如果我在Python中引发异常,这就是我得到的:

raise Exception("Hello world")
Traceback (most recent call last):

  File "<ipython-input-24-dd3f3f45afbe>", line 1, in <module>
    raise Exception("Hello world")

Exception: Hello world
Run Code Online (Sandbox Code Playgroud)

注意最后一行说的Exception: Hello world.给定Exception(foo = Exception("Hello world")),我该如何生成这样的文本?以下工作均不属于:

str(foo)
Out[27]: 'Hello world'

repr(foo)
Out[28]: "Exception('Hello world',)"

"{}".format(foo)
Out[29]: 'Hello world'

"{}: {}".format(type(foo), foo)
Out[30]: "<type 'exceptions.Exception'>: Hello world"
Run Code Online (Sandbox Code Playgroud)

python exception string-formatting

6
推荐指数
2
解决办法
8240
查看次数