python3中的range函数有三个参数,其中两个是可选的.所以参数列表看起来像:
[开始],停止,[步骤]
所以这意味着(如果我错了,请纠正我)在非可选参数之前有一个可选参数.但是,如果我尝试定义这样的函数,我得到这个:
>>> def foo(a = 1, b, c = 2):
print(a, b, c)
SyntaxError: non-default argument follows default argument
Run Code Online (Sandbox Code Playgroud)
这是我作为'普通'python用户不能做的事情,还是我能以某种方式定义这样的功能?当然我可以做点什么
def foo(a, b = None, c = 2):
if not b:
b = a
a = 1
Run Code Online (Sandbox Code Playgroud)
但是例如帮助功能会显示奇怪的信息.所以我真的想知道是否可以定义上面的函数(第一个).
我一直试图通过发送一个SIGTERM信号来制作一个守护进程(就像通常用于守护进程一样).守护进程获取了一些应该在运行后释放的资源,我想使用括号来执行此操作.
我注意到当程序以SIGTERM终止时,不会运行括号的清理部分.这个程序可以复制:
main = bracket (return "ending")
(\x -> putStrLn x)
(\_ -> threadDelay 10000000000000)
Run Code Online (Sandbox Code Playgroud)
这个简单的程序应该获取字符串"ending"(为了简单起见,只需重新调整它)并在结束时打印获取的字符串.
当我用ctrl-c中断程序时,它表现得像预期的那样并在退出时打印"结束",但是当我用它killall -TERM test(可执行文件命名为test)杀死它时,它打印"Beendet"(德语为"Ended"),所以支架的最后部分未运行.
这是一个错误还是我做错了什么?
我正在使用GHC 7.6.3并且我在Linux/GNU上运行Debian jessie i386(i686)
当我第一次偶然发现常量defaultTimeLocale时System.Locale,我认为它应该包含当前语言环境的默认TimeLocale.
经过一些尝试,我意识到它总是包含相同的常量,并查看源代码System.Locale快速显示它实际上只是一个常量.(后来我意识到这种类型也告诉我.由于defaultTimeLocale它不是一个IO值而且不带任何参数,它必须是常量.)
在Haskell中获取TimeLocale当前语言环境的当前方法是什么?
该execute函数的文档Reactive.Banana.Frameworks说"无法保证执行操作的顺序".
我不确定这里的排序是什么意思.由于事件只会同时触发一个动作,因此这里没有太多的命令可以保证,因此我可以想象的最可能的情况是:
a :: MomentIO (Event t)
a = ...
b :: MomentIO (Event t)
b = ...
makeEvent :: MomentIO (Event (MomentIO (Event t))
makeEvent = fromAddHandler $ ... -- Some AddHandler that first fires a
-- and later fires b
network :: MomentIO ()
network = do
...
newEvents <- makeEvent
ts <- execute newEvents >>= switchE
...
Run Code Online (Sandbox Code Playgroud)
非保证我能想象这里是的执行顺序a和b切换,从而b最先被执行.如果我们假设a并且b都修改某些小部件的行为(使用liftIO)然后注册它们相应的事件处理程序(取消注册先前注册的那个),则切换执行顺序a并且b …
我已经用 Haskell 编写了一个应用程序,它开始对用户有点用处了。然而,我的应用程序并不是针对技术娴熟的人,更不用说 Haskell 开发人员了,所以从源代码构建我的应用程序并不是我真正可以期望他们做的事情。
因此,为了让我的用户可以使用我的应用程序,我想自己构建应用程序,将其可执行文件、数据文件、依赖项、依赖项的数据文件、所需的许可信息和其他所需的文件放入一个存档中,然后将该存档放在一个网站。现在,用户可以下载该存档,解压缩它并拥有运行我的应用程序所需的一切。
我上面描述的过程似乎是向我分发应用程序二进制文件的一种相当常见的方式。但是,我无法弄清楚要使用哪些工具或如何配置它们以将我的应用程序构建到上述二进制分发版中。
Cabal(图书馆)似乎具有所需的功能。通常的Setup.hs脚本(没有 cabal(工具)或堆栈作为包装器)支持诸如--prefix和 之类的选项,--enable-relocatable它允许您将包安装到给定的前缀并以这样的方式编译它们,以确保如果前缀(作为一个整体)被移动到其他地方。
但是使用 rawSetup.hs的缺点是它不处理自动安装依赖项。而且由于许多大小合适的 Haskell 应用程序将有数百个依赖项(或至少我的),手动配置和构建它们中的每一个并不是真正可行的。
安装依赖项问题的明显解决方案是使用包装器工具,例如 cabal(工具)或堆栈,因为它们是专门用于处理大型依赖项树的问题。但是,它们似乎都有问题阻止我将应用程序构建为二进制分发版:
stack build没有选项--prefixor--enable-relocatable而总是安装到.stack-workand ~/.stack。
cabal v2-*有选项--prefix,--enable-relocatable但似乎完全忽略它们,而是始终安装到dist-newstyle 和~/.cabal。
cabal v1-*对于非常简单的情况,似乎可以做我想做的事情。然而,对于更复杂的情况,它会产生模糊的构建失败,其中 GHC 抱怨没有从依赖项中找到模块,而 cabal 抱怨部分安装的包。但即使将这些故障放在一边,对新工作流使用旧命令一般来说似乎也不是一个好主意。
那么,由于我似乎对这些工具不太走运,我可以使用哪些其他工具将 Haskell 应用程序构建为二进制发行版?或者,也许我列出的工具之一实际上可以满足我的需求,而我只是以错误的方式使用它?
范围的一些限制:
我有以下三个python脚本:
parent1.py
import subprocess, os, sys
relpath = os.path.dirname(sys.argv[0])
path = os.path.abspath(relpath)
child = subprocess.Popen([os.path.join(path, 'child.lisp')], stdout = subprocess.PIPE)
sys.stdin = child.stdout
inp = sys.stdin.read()
print(inp.decode())
Run Code Online (Sandbox Code Playgroud)
parent2.py:
import sys
inp = sys.stdin
print(inp)
Run Code Online (Sandbox Code Playgroud)
child.py:
print("This text was created in child.py")
Run Code Online (Sandbox Code Playgroud)
如果我用parent1.py调用:
python3 parent1.py
Run Code Online (Sandbox Code Playgroud)
它给了我预期的以下输出:
This text was created with child.py
Run Code Online (Sandbox Code Playgroud)
如果我用parent2.py调用:
python3 child.py | python3 parent2.py
Run Code Online (Sandbox Code Playgroud)
我得到相同的输出.但是在第一个例子中,我得到child.py的输出作为字节,而在第二个例子中我直接得到它作为字符串.为什么是这样?它只是python和bash管道之间的区别还是我还能做些什么来避免这种情况?
我试图在python中获取键盘的原始输入。我有一个带可编程键的Logitech游戏键盘,但是Logitech不提供Linux驱动程序。所以我认为我可以(尝试)为此编写自己的驱动程序。考虑到解决方案可能是这样的:
with open('/dev/keyboard', 'rb') as keyboard:
while True:
inp = keyboard.read()
-do something-
Run Code Online (Sandbox Code Playgroud)
英语不是我的母语。如果发现错误,请更正。
在haskell中,假设我有一个以下形式的函数调用:foo a b,其中a不依赖于b,反之亦然。看起来它可以自动检测到a并且b可以并行评估,但在 GHC 中似乎并非如此。相反,需要使用像 need 这样的结构par来表示可以并行评估的内容。
那么,为什么 Haskell 中的并行化不能自动发生呢?或者,如果已经存在,为什么还会par存在这样的结构?
我正在尝试针对某些 C++ 源构建带有 FFI 的 Haskell 可执行文件。
我有一个像这样的 C 头文件 (cstuff/foo.h):
#ifndef _FOO_H_
#define _FOO_H_
#include <somecppheader.c> // Some header outside of my control with C++ constructs
void foo();
#endif
Run Code Online (Sandbox Code Playgroud)
foo 的实现应该无关紧要。它会做一些事情并使用一些在 somecppheader.h 中声明的东西。
Cabal 文件中的可执行部分如下所示:
executable botprog
main-is: Main.hsc
other-extensions: ForeignFunctionInterface
build-depends: base >=4.7 && <4.8
build-tools: hsc2hs
default-language: Haskell2010
include-dirs: cstuff
c-sources: cstuff/foo.cpp
pkgconfig-depends: somelib -- The one that contains somecppheader.h
Run Code Online (Sandbox Code Playgroud)
Main.hsc 看起来像这样:
{-# LANGUAGE ForeignFunctionInterface #-}
#include <foo.h>
foreign import ccall "foo.h foo" :: IO ()
main …Run Code Online (Sandbox Code Playgroud) 考虑三个这样的类:
class A {
int bar;
};
class B {
A* a;
public:
B(*A na)
: a(na)
{}
~B() {
a->bar = 0;
}
};
class Foo {
A* a;
B b;
public:
Foo()
: a(new A)
, b(a)
{}
~Foo() {
delete a;
}
};
Run Code Online (Sandbox Code Playgroud)
创建一个实例Foo,会产生一个Foo带有指向a A和a B的指针.
当Foo删除实例时,删除指针a,然后b调用析构函数,但~B尝试访问a,这被释放~Foo,导致分段错误.
有没有办法b在运行之前调用析构函数~Foo?
我知道我可以通过制作b指针或制作a非指针来解决这个问题.如果A是抽象的话,后者不起作用,我想知道如果没有 …
我正在用汇编程序编写一个小内核。我在 QEMU 中运行它,并遇到一些错误的问题。现在我想用dbg调试内核。所以我像这样组装它:
$ nasm -g -f elf -o myos.elf myos.asm
$ objcopy --only-keep-debug myos.elf myos.sym
$ objcopy -O binary myos.elf myos.bin
Run Code Online (Sandbox Code Playgroud)
然后我在 QEMU 中运行它:
$ qemu-system-i386 -s -S myos.bin
Run Code Online (Sandbox Code Playgroud)
然后我与 gdb 连接:
$ gdb
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in ?? ()
symbol-file myos.sym
Reading symbols from /home/sven/Projekte/myos/myos.sym...done.
Run Code Online (Sandbox Code Playgroud)
welcome我的内核中有一个指向字符串的标签。在测试时,我尝试查看该字符串,结果如下:
(gdb) x/32b welcome
0x1e <welcome>: 0x00 0xf0 0xa5 0xfe 0x00 0xf0 0x87 0xe9
0x26: 0x00 0xf0 0x6e 0xc9 0x00 0xf0 0x6e 0xc9
0x2e: 0x00 0xf0 …Run Code Online (Sandbox Code Playgroud)