在我看来,在 Django 的基于类的通用视图中,参数request和argskwargs传输,既作为视图实例属性,又作为方法参数。
我到底是什么意思?
Class django.views.generic.base.View,定义了以下函数,由其as_view方法调用:
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
该函数首先将request、args和设置为视图实例属性,然后使用所有这些作为参数kwargs调用视图的方法。dispatch如果有的话,这样做的具体目的是什么?这不是多余的吗?
我用 CompanyCreateView 创建了一个新模型。用 保存后f.save(),我希望浏览器加载成功 url
url(r'^comp/(?P<pk>\w+)/$', CompanyDetailView.as_view(), name="profile"),
Run Code Online (Sandbox Code Playgroud)
这是我的 CreateView。
class CompanyCreateView(CreateView):
model = Company
form_class = CompanyForm
success_url = "/comp/???pk???"
def form_valid(self, form):
f = form.save(commit=False)
f.submitter_id = 99 #dont know how to remove the submitter, its not set in the model
f.save()
return super(CreateView, self).form_valid(form)
def get_success_url(self, **kwargs):
return reverse("profile", kwargs={'pk': self.request.pk})
Run Code Online (Sandbox Code Playgroud)
如何使用 args 参数返回pk?
如何$@在保持其属性的同时存储在变量中?
即使我$@在所有可能的情况下使用或我自己的变量,我也想获得完全相同的行为。
以下尝试无效:
args=$@
args2="$@" # the arguments are combined (see the last output paragraph)
Run Code Online (Sandbox Code Playgroud)
我使用以下行测试了它们:
s.sh A B=" " C
Run Code Online (Sandbox Code Playgroud)
s.sh
args=$@
args2="$@" # the arguments are combined (see the last output paragraph)
Run Code Online (Sandbox Code Playgroud)
A.java
s.sh A B=" " C
Run Code Online (Sandbox Code Playgroud)
实际输出:
A B= C
A B= C
A B= C
A B= C
A B= C
A B= C
3: [A, B=, C]
3: [A, B=, C]
3: [A, B=, C]
1: [A B= C]
1: …Run Code Online (Sandbox Code Playgroud) 在Python中,如何检查*args[0]是否存在?
def my_fxn(self, *args):
print(args[0])
my_fxn('ABC') # this prints 'ABC'
my_fxn() # this crashes with "IndexError: tuple index out of range"
Run Code Online (Sandbox Code Playgroud) 将参数传递给 apscheduler 处理函数 这对我来说不起作用,我尝试了不同的语法变体(见下文)。我可能会遗漏一些更基本的东西。
@app.route("/tick", methods=['GET', 'POST'])
def tick(datetimes, texti):
flash('DO! Sir, you have planned on the {} this:'.format(datetimes), 'success')
flash(texti, 'info')
return redirect(url_for('td_list'))
def Schedule_reminders():
with app.test_request_context():
if os.environ.get("WERKZEUG_RUN_MAIN") == "true":
# /sf/ask/661437101/
scheduler = BackgroundScheduler()
tds = Td.query.all()
for td in tds:
run_date = td.date +' '+ td.time +':00'
# /sf/ask/868889591/#39027779
datetimes = run_date
texti = td.text
#scheduler.add_job(tick, 'date', [datetimes, texti], run_date)
# ValueError: dictionary update sequence element #0 has length 1; 2 is required
#scheduler.add_job(lambda: tick(datetimes, texti), …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到复制此C功能的通用方法:
int main(int argc, char** argv){
fprintf(2,"%s: error you did something wrong.\n", argv[0]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在java中.到目前为止,唯一的方法是将其硬编码到应用程序中,这很难看.我想得到类似的东西:
someObj.getClass().getSimpleName();
Run Code Online (Sandbox Code Playgroud)
在我的静态主体内,没有回到我自己的课堂.
这甚至可能吗?
我寻找一个好时光并没有把这个变成一个.
重复的问题,请参阅Java中的$ 0(程序名)?发现主要课程?回答
如何从argsJava变量中打印出一组整数?
我试过了:
System.out.println("The numbers are " + args.length);
Run Code Online (Sandbox Code Playgroud)
但所有这一切都是打印出数组中的元素数量.
我想要它,如果有5个参数传递:1 2 3 4 5输出应该是:
1, 2, 3, 4, 5
Run Code Online (Sandbox Code Playgroud) 我知道当我们使用时*args,这意味着我们不确定该函数将接收多少个参数.但是,Python最终将它们绑定在一个元组中:
>>> def f(*args):
return type(args)
>>> f(3,4,4,5)
<class 'tuple'>
Run Code Online (Sandbox Code Playgroud)
假设我有一个简单的函数,它返回输入不变.我可以像这样使用嵌套的lambda:
>>> def f (x):
return x
>>> l = f(lambda x: len(x))
>>>
>>> l((1,2,3))
3
Run Code Online (Sandbox Code Playgroud)
请注意,输入是一个元组.但是,当我尝试使用以下函数编写相同的函数时会发生这种情况args:
>>> def f (*args):
return args
>>> l = f(lambda x: len(x))
>>> l((1,2,3))
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
l((1,2,3))
TypeError: 'tuple' object is not callable
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误,我该如何避免?
什么是使用*的.format(*)?在下面的格式函数中使用它时,print(new_string.format(*sum_string))它会将输出中sum_string的值从18更改为1为什么会发生这种情况?我已阅读以下链接*args,**kwargs但无法理解这是如何适用于该.format()功能
sum_string = "18"
new_string = "This is a new string of value {}"
print(new_string.format(sum_string)) #it provides an output of value 18
print(new_string.format(*sum_string)) #it provides an output of value 1
Run Code Online (Sandbox Code Playgroud) 我是docker / k8s世界的新手,有人问我是否可以使用args部署容器来修改行为(通常是应用程序在“主”版本还是“从”版本中工作)。也许不是最佳解决方案,但它可以工作:
这是验证的简单测试。我用一个脚本创建了一个自定义图像:role.sh:
#!/bin/sh
ROLE=$1
echo "You are running "$ROLE" version of your app"
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM centos:7.4.1708
COPY ./role.sh /usr/local/bin
RUN chmod a+x /usr/local/bin/role.sh
ENV ROLE=""
ARG ROLE
ENTRYPOINT ["role.sh"]
CMD ["${ROLE}"]
Run Code Online (Sandbox Code Playgroud)
如果我使用以下命令从docker启动此容器:
docker run -dit --name test docker.local:5000/test master
Run Code Online (Sandbox Code Playgroud)
我最终得到以下日志,这正是我要查找的内容:
You are running master version of your app
Run Code Online (Sandbox Code Playgroud)
现在,我想使用yaml文件在k8s上具有相同的行为。我尝试了几种方法,但是都没有用。
YAML文件:
apiVersion: v1
kind: Pod
metadata:
name: master-pod
labels:
app: test-master
spec:
containers:
- name: test-master-container
image: docker.local:5000/test
command: ["role.sh"]
args: ["master"]
Run Code Online (Sandbox Code Playgroud)
我看到了很多不同的方法可以做到这一点,但我必须说,我仍然没有理解ARG和ENV之间的区别。
我也尝试过
- name: test-master-container
image: docker.local:5000/test …Run Code Online (Sandbox Code Playgroud) args ×10
python ×5
django ×2
java ×2
python-3.x ×2
apscheduler ×1
arrays ×1
bash ×1
command-line ×1
docker ×1
flask ×1
integer ×1
kubernetes ×1
lambda ×1
redundancy ×1
request ×1
tuples ×1
url ×1
yaml ×1