小编mur*_*own的帖子

如何使用`from module import*`重新加载导入的python模块

我在这个有用的问答中看到了人们可以使用的,reload(whatever_module)或者在Python 3中imp.reload(whatever_module).

我的问题是,如果我说from whatever_module import *要导入怎么办?然后我whatever_module在使用时无需参考reload().你们是否会因为将整个模块投入全局命名空间而对我大喊大叫?:)

python python-module python-import

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

ply lexmatch正则表达式具有与通常重复不同的组

我正在使用ply并注意到存储在t.lex.lexmatch中的令牌重新匹配与使用re模块以通常方式定义的sre_pattern之间存在奇怪的差异.小组(x)似乎是1.

我已经定义了一个简单的词法分析器来说明我所看到的行为:

import ply.lex as lex

tokens = ('CHAR',)

def t_CHAR(t):
    r'.'
    t.value = t.lexer.lexmatch
    return t

l = lex.lex()
Run Code Online (Sandbox Code Playgroud)

(我收到关于t_error的警告但暂时忽略它.)现在我将一些输入提供给词法分析器并获取一个令牌:

l.input('hello')
l.token()
Run Code Online (Sandbox Code Playgroud)

我得到了LexToken(CHAR,<_sre.SRE_Match object at 0x100fb1eb8>,1,0).我想看一下匹配对象:

m = _.value
Run Code Online (Sandbox Code Playgroud)

所以现在我看看这些小组:

m.group()=> 'h'正如我所料.

m.group(0)=> 'h'正如我所料.

m.group(1)=> 'h',但我希望它没有这样一个群体.

将此与手动创建这样的正则表达式进行比较:

import re
p = re.compile(r'.')
m2 = p.match('hello')
Run Code Online (Sandbox Code Playgroud)

这给了不同的群体:

m2.group()= 'h'正如我所料.

m2.group(0)= 'h'正如我所料.

m2.group(1)IndexError: no such group按照我的预期给出.

有谁知道为什么存在这种差异?

python regex lex ply

6
推荐指数
1
解决办法
727
查看次数

是否已有python生成器执行这些基本操作?

我发现自己使用这两个自定义生成器,并认为"必须有一个itertools函数或者已经做到这一点的东西!但是没有发现任何东西.我错过了什么吗?谢谢!

def gothru(iters):
  for i in iters:
    for j in i:
      yield j

def overnover(fn,startval):
  val = startval
  while True:
    val = fn(val)
    yield val
Run Code Online (Sandbox Code Playgroud)

编辑:我后来想象如何overnover用于生成斐波纳契序列,我意识到它需要被推广以允许函数有多个参数

def overnover(fn,*args):
  while True:
    args = fn(*args)
    return args
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

fibInfo = overnover(lambda x,y: (x+y, x), 1, 1)
Run Code Online (Sandbox Code Playgroud)

- >(2,1)......(3,2)...(5,3)...(8,5)......然后:

fib = imap(lambda x:x[0], fibInfo)
Run Code Online (Sandbox Code Playgroud)

- > 2 ... 3 ... 5 ... 8 ......

多谢你们!

python iterator generator

3
推荐指数
1
解决办法
112
查看次数

如何在不添加<LF>的情况下将以<CR>结尾的字符串分配给vimscript变量?

我最近一直在玩vim宏(目前在MacVim中),有时我喜欢用例如明确地将宏分配到寄存器中:let @a='(macro keystrokes)'.这通常工作正常,但我发现了一种奇怪的行为,其中任何时候我分配一个以Carriage Return/^ M结尾的字符串值,vim会在将它放入寄存器之前自动将Endfeed/^ J添加到结尾,这会影响执行宏!

示例:假设我记录了一个进入插入模式的简单宏,键入"hey",退出插入模式,然后按两次Enter键向下走2行.我通过输入qaihey<Escape><Enter><Enter>q将其记录到寄存器@a中,它将以下内容存储在@a中:

ihey^[^M^M
Run Code Online (Sandbox Code Playgroud)

到目前为止@a一切都那么好,并且通过键入来执行宏只是它应该是什么.我可以将这个相同的宏放入寄存器@a的另一个非常好的方法是将整个事物(ihey<Ctrl-V><Escape><Ctrl-V><Enter><Ctrl-V><Enter>)输入缓冲区,然后用它进行操作"ay- 最终结果是相同的.但这是奇怪的事情 - 假设我只想使用let语句将该字符串直接分配到@a :

:let @a='ihey^[^M^M'
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入:reg要查看它所显示的值,那么^J由于某种原因,最后会有额外的值:

"8     ...
"9     ...
"a     ihey^[^M^M^J
"b     ...
Run Code Online (Sandbox Code Playgroud)

有额外的^J原因导致它在执行宏时会减少额外的行,所以它实际上改变了行为.

有谁知道为什么要添加这个额外的角色?任何人都知道我怎么能得到一个^M以寄存器(或任何变量)结尾的字符串值,而不需要额外^J添加?

vim macros special-characters macvim

3
推荐指数
1
解决办法
228
查看次数