我正在使用Python库Fabric来进行一些远程服务器维护.Fabric会自动输出对远程和本地命令的所有响应,除非您将命令包装在一对语句中.像这样,在本地机器上,
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = local("uname -a", True)
Run Code Online (Sandbox Code Playgroud)
或者像这样在远程机器上:
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = run("uname -a")
Run Code Online (Sandbox Code Playgroud)
我正在写一个漫长而复杂的任务,并发现自己一遍又一遍地重复这两个.我想编写一个名为_mute()的函数来防止重复.它会让我做这样的事情:
def _mute(fabric_cmd, args):
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = fabric_cmd(args)
return output
def some_remote_task():
# Run a remote task silently
_mute(remote, 'uname -a')
def some_local_task():
# Run a local task silently
_mute(local, 'uname -a', True)
Run Code Online (Sandbox Code Playgroud)
我已经研究了一些解决方案并且知道"eval"可以为我做这件事.但是我读到的关于eval的每一页都表明,由于安全问题,这几乎总是一个坏主意.我调查了部分内容,但我无法弄清楚如何在我的_mute函数中调用参数.我猜这里有一个更高级别的Python概念,我在这里缺少.做这个的pythonic方法是什么?感谢您提供的任何方向.
假设我有一个get_data
需要一些关键字参数的函数.有什么方法可以做到这一点
def get_data(arg1, **kwargs):
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, **data)
Run Code Online (Sandbox Code Playgroud)
因此,我们的想法是避免在函数调用和函数定义中键入参数名称.我用字典作为参数调用函数,字典的键成为函数的局部变量,它们的值是字典值
我尝试了以上并得到错误说global name 'arg2' is not defined
.我明白我可以改变locals()
定义get_data
来获得所需的行为.
所以我的代码看起来像这样
def get_data(arg1, kwargs):
locals().update(kwargs)
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, data)
Run Code Online (Sandbox Code Playgroud)
它也行不通.我也无法在不使用的情况下实现这一行为locals()
?
我正在尝试使用numpys apply_along_axis和一个需要多个参数的函数.
test_array = np.arange(10)
test_array2 = np.arange(10)
def example_func(a,b):
return a+b
np.apply_along_axis(example_func, axis=0, arr=test_array, args=test_array2)
Run Code Online (Sandbox Code Playgroud)
在手册中:http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html有附加参数的参数args.但是如果我尝试添加该参数,python会返回错误:
*TypeError:apply_along_axis()得到一个意外的关键字参数'args'*
或者如果我不使用args,则缺少参数
*TypeError:example_func()只需2个参数(给定1个)*
这只是一个示例代码,我知道我可以用不同的方式解决这个问题,比如使用numpy.add或np.vectorize.但我的问题是,我是否可以使用numpys apply_along_axis函数和一个使用多个参数的函数.
如果我有这样的模型:
class Article(models.Model):
title = models.CharField(max_length=200)
# ... rest of the code ...
def get_absolute_url(self):
return reverse('article-detail', args=[str(self.pk)])
Run Code Online (Sandbox Code Playgroud)
我有一个这样的网址映射:
url(r'^article/(?P<pk>[0-9]+)/$', views.ArticleView.as_view(), name='article-detail'),
Run Code Online (Sandbox Code Playgroud)
在模板中我应该使用:
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
Run Code Online (Sandbox Code Playgroud)
或者
<a href="{% url 'article-detail' article.pk %}">{{ article.title }}</a>
Run Code Online (Sandbox Code Playgroud)
我仍然认为这两个都是好主意,但哪个是最好的?
在我写的第一个代码中args=[str(self.pk)]
,为什么我必须将 self.pk 转换为字符串?URL 必须是字符串吗?
在我的通用视图中,如何使用 pk 变量?我真的与迷茫slug_field
,slug_url_kwarg
,pk_url_kwarg
,query_pk_and_slug
。
哪个匹配哪个?
如果我设置query_pk_and_slug
为True,slug_field
= pk?
对于这种情况,假设有一个声明的基表名为Game的表,其列名为"espn_game_id"和"a_name".在变量"s"下打开一个会话对象.这样可行:
s.add(Game(espn_game_id=888, a_name='lol'))
s.commit()
Run Code Online (Sandbox Code Playgroud)
这失败了:
n = {"espn_game_id": 888, "a_name": 'lol'}
s.add(Game(n))
s.commit()
Run Code Online (Sandbox Code Playgroud)
这是有效的(假设已经存在espn_game_id == 888的条目):
n = {"a_name": 'lol'}
s.query(Game).filter(Game.espn_game_id==888).update(n)
s.commit()
Run Code Online (Sandbox Code Playgroud)
为什么第二种情况会失败并且有没有办法让这种类型的语法在这里工作?
我有一个 Python (3) 函数
def f(a, b, c=1, d=2):
pass
Run Code Online (Sandbox Code Playgroud)
我想在代码中建立一个参数列表。实际用例是基于一些命令行参数解析来执行此操作,但这是一个一般性问题(我对 python 相当陌生)例如
myargs = {}
myargs['positionalParams'] = ['foo', 'bar']
myargs['c']=2
myargs['d']=3
f(myargs)
Run Code Online (Sandbox Code Playgroud)
我知道我可以f(*somelist)
将列表扩展为单独的参数,但是如何混合使用位置参数和可选参数呢?或者我做两次,一次用于位置,一次用于其他人的字典?
我有一个boiler platey类,它将一些操作委托给引用类.它看起来像这样:
class MyClass():
def __init__(self, someClass):
self.refClass = someClass
def action1(self):
self.refClass.action1()
def action2(self):
self.refClass.action2()
def action3(self):
self.refClass.action3()
Run Code Online (Sandbox Code Playgroud)
这是refClass:
class RefClass():
def __init__(self):
self.myClass = MyClass(self)
def action1(self):
#Stuff to execute action1
def action2(self):
#Stuff to execute action2
def action3(self):
#Stuff to execute action3
Run Code Online (Sandbox Code Playgroud)
我想使用Python Metaprogramming使这更优雅和可读,但我不知道如何.
我听说过setattr和getattr,我想我可以做类似的事情
class MyClass():
def __init__(self, someClass):
self.refClass = someClass
for action in ['action1', 'action2', 'action3']:
def _delegate(self):
getattr(self.refClass, action)()
Run Code Online (Sandbox Code Playgroud)
然后我知道我需要从某个地方做这个,我想:
MyClass.setattr(action, delegate)
Run Code Online (Sandbox Code Playgroud)
我无法完全掌握这个概念.我理解不重复代码的基础知识,并使用带有函数编程的for循环生成方法,但后来我不知道如何从其他地方调用这些方法.Heeeelp!
可能重复:
*args和**kwargs是什么意思?
我正在阅读挖掘社交网络并遇到一个我无法弄清楚的python语法:
transforms = [(', Inc.', ''), (', Inc', ''), (', LLC', ''), (', LLP', '')]
"google, Inc.".replace(*transforms[0])
Run Code Online (Sandbox Code Playgroud)
但如果我输入
*transforms[0]
Run Code Online (Sandbox Code Playgroud)
在解释器中,它说它是无效的语法.我用Google搜索了,但是python文档真的不适合这份工作.
那么星号在这里意味着什么呢?谢谢你们.
我试图理解python中函数定义中*args和**args之间的区别.在下面的示例中,*args用于打包到元组并计算总和.
>>> def add(*l):
... sum = 0
... for i in l:
... sum+=i
... return sum ...
>>> add(1,2,3)
6
>>> l = [1,2,3]
>>>add(*l)
6
Run Code Online (Sandbox Code Playgroud)
对于**args,
>>> def f(**args):
... print(args)
...
>>> f()
{}
>>> f(de="Germnan",en="English",fr="French")
{'fr': 'French', 'de': 'Germnan', 'en': 'English'}
>>>
Run Code Online (Sandbox Code Playgroud)
我看到它需要参数并变成字典.但我不明白使用**args时可能有用的实用程序或其他东西.事实上,我不知道*args和**args被称为什么(vararg和?)
谢谢
假设我有一个带字符串参数的函数.但我想动态生成它们.似乎没有办法轻松插入.这是怎么做到的?看看我的例子
i_take_strings('one', 'two', 'and_the_letter_C')
s = 'one two and_the_letter_c'
i_take_strings(x for x in s.split()) #python thinks I'm retarded with this attempt
Run Code Online (Sandbox Code Playgroud) python ×9
arguments ×1
decorator ×1
django ×1
dry ×1
eval ×1
fabric ×1
getattr ×1
numpy ×1
parameters ×1
python-3.x ×1
setattr ×1
sqlalchemy ×1
string ×1