Python类有一个名为init的初始化方法.初始化程序通常会接受多个复制到同名属性的参数.
def __init__(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
Run Code Online (Sandbox Code Playgroud)
这是很多工作,对我来说感觉"unpythonic".有没有办法自动化这个过程?
我想也许沿着这些方面的东西(下面的伪代码)可以工作:
for x in __init__.argument_names:
exec('self.' + x + ' = ' + x)
Run Code Online (Sandbox Code Playgroud)
我知道用这种方式调用exec不是好习惯.但也许Python开发团队已经创建了一种安全且等效的自动执行此任务的方法.
有什么建议?
FS
我在F# Design PatternsGene Belitski 的书中找到了下面的代码.我一直在阅读有关F#的内容,但我还没有在该书或其他地方找到这种语法的解释.我理解关键字yield及其作用,我知道yield和printfn语句的返回值都是unit类型.我不明白的是方括号.这些语句不像分号创建那样用分号分隔.这必须是一个特殊的语法,但我找不到它的引用.有人可以帮忙吗?
let eagerList = [
printfn "Evaluating eagerList"
yield "I"
yield "am"
yield "an"
yield "eager"
yield "list" ]
Run Code Online (Sandbox Code Playgroud) 安装包XPlot.Plotly (v. 1.4.2)使用Nuget失败的消息,有不兼容的最新版本(v. 10.0.3)的Newtonsoft.Json,这是我以前安装.该消息还表明version 9.0.1 of Newtonsoft.Json可行.所以我卸载了最新版本Newtonsoft.Json,已安装version 9.0.1,然后才能安装XPlot.Plotly.
这是处理这种不兼容性的正确方法吗?
我最终能否使用这两种软件包的最新版本?
我在Windows 10下安装了Anaconda。一切正常。我也跑了
conda upgrade --all
Run Code Online (Sandbox Code Playgroud)
在命令提示符下。
但是,我注意到在命令提示符下键入此命令时:
pip list -o
Run Code Online (Sandbox Code Playgroud)
我得到(除其他事项外)
astroid (1.4.7) - Latest: 1.4.8 [wheel]
Run Code Online (Sandbox Code Playgroud)
这意味着程序包astroid可以在pip下升级。但是,当我转到Anaconda Navigator并查看可升级软件包的列表时,却没有看到astroid。(我无法找到查看在Conda下可升级的软件包的命令行方式)。
有人可以解释为什么astroid在Pip下而不是Conda下可升级吗?
抱歉,这个问题还不清楚。我对F#4.0中的软件包感到困惑,这是我能做的最好的事情。
该书Expert F# 4.0由Don赛姆,亚当Granicz和安东尼奥奇斯泰尼诺包含的代码用于处理JSON数据。代码以
open FSharp.Data
open FSharp.Data.JsonExtensions
Run Code Online (Sandbox Code Playgroud)
我已经FSharp.Data在Visual Studio中安装了。不过,“ JsonExtensions”一词在其下仍显示红色花键,其余代码无法编译。
要Add References在Solution Explorer中我没有找到一个包FSharp.Data.JsonExtensions。我也看了下NuGet,没有发现包裹FSharp.Data.JsonExtensions。有文档
表明它是一个模块。但是,使用Visual Studio中不出现下点(只有一个条目:)JsonExtensionsFSharp.Data.Unit Systems
如何使该模块中的代码可用,以便我可以运行书中的代码?
我正在使用Visual Studio 2017. 它有很好的弹出窗口,显示有关类型和对象的信息。但有时信息会占据屏幕的很大一部分(例如,对于Deedle Frame)。在这些情况下想按一些键并摆脱弹出窗口。我试过了Esc。它在很短的时间内工作,然后信息弹出窗口重新出现。
有没有让信息弹出窗口消失的键?
或者,是否可以停止显示此类弹出窗口并使用组合键调用它们?
(我试图去Tools/Options/Text Editor/All Languages/更改一些设置(Auto list members和Parameter information),但没有用。同样,Tools/Options/Text Editor/F#/General具有相同的设置,但更改它们无济于事。)
我最近开始使用 JET.jl。在大多数情况下这是有帮助的。然而,有时我就是无法弄清楚为什么我的代码有问题。下面是一个例子。该功能foo非常基本并且运行良好。尽管如此,JET.jl\xe2\x80\x99s 宏仍@report_call报告错误。我不知道那是什么。使用宏调用提供的信息来识别问题的最佳方法是什么?
using DataFrames, JET\ndf = DataFrame(:A => [1.0, 2.0, 3.0, 4.0])\n# 4\xc3\x971 DataFrame\n# Row \xe2\x94\x82 A \n# \xe2\x94\x82 Float64\n# \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n# 1 \xe2\x94\x82 1.0\n# 2 \xe2\x94\x82 2.0\n# 3 \xe2\x94\x82 3.0\n# 4 \xe2\x94\x82 4.0\n\nfunction foo(df::DataFrame)::DataFrame\n v = 1:nrow(df)\n df[!, :B] = v\n\n return df\nend\n# foo (generic function with 1 method)\n\nfoo(df)\n# 4\xc3\x972 DataFrame\n# Row \xe2\x94\x82 A B \n# \xe2\x94\x82 Float64 Int64\n# \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n# 1 \xe2\x94\x82 1.0 1\n# 2 \xe2\x94\x82 2.0 2\n# 3 \xe2\x94\x82 3.0 3\n# 4 \xe2\x94\x82 …Run Code Online (Sandbox Code Playgroud) 我需要将字符串转换为Literal,以便将其作为参数传递给CsvProvider.但我无法做到.下面的代码运行没有问题:
open System.IO
open FSharp.Data
open FSharp.Data.JsonExtensions
let charSwitch (a: char) b x =
if x = a then
b
else
x
let jsonDataPath = Path.Combine(__SOURCE_DIRECTORY__, @"data\fractal.json")
let jsonData = JsonValue.Load(jsonDataPath)
/// Path with traded assets
let trp = ((jsonData?paths?tradedAssets).AsString() |> Core.String.map (charSwitch '\\' '/')).ToString()
printfn "trp is a standard string: %s" trp
// trp is a standard string: H:/Dropbox/Excel/Data/Fractal/Traded.csv
Run Code Online (Sandbox Code Playgroud)
但是,添加以下两行时
[<Literal>]
let tradedPath = trp
Run Code Online (Sandbox Code Playgroud)
最后我得到了消息This is not a valid constant expression or custom attribute value.
我甚至试图复制trp,但这没有帮助. …
F#语言包含Discriminated Union类型option<'T>.几个模块包含有用的函数,XYZ.tryFind其返回值是类型的对象option<'T>.(实施例:List.tryFind,Map.tryFind,Array.tryFind).F# 4.1添加了Result<'S,'T>类似option<'T>但提供更多信息的类型.是否有类似于tryFind该Result<'S,'T>类型的功能?
下面的代码是尝试创建这样的功能.
let resultFind (ef: 'K -> 'T) (tryfind: 'K -> 'M -> 'T option) (m: 'M) (k: 'K) =
let y = tryfind k m
match y with
| Some i -> Result.Ok i
| None -> Result.Error (ef k)
let fields = [("Email", "jdoe@xyz.com"); ("Name", "John Doe")]
let myMap = fields |> Map.ofList
let …Run Code Online (Sandbox Code Playgroud) 我有一个可区分的联合,我想根据字符串(从 JSON 文件中读取)选择一个案例。这很容易做到:
type MyDU = A | B
let str = "B"
let myDU : MyDU =
match str with
| "A" -> MyDU.A
| "B" -> MyDU.B
| _ -> failwith "whatever"
// val myDU : MyDU = B
Run Code Online (Sandbox Code Playgroud)
但是,有时会有很多情况,需要大量打字。
该Microsoft.FSharp.Reflection库允许我获取一个UnionCaseInfo
对象:
open Microsoft.FSharp.Reflection
let myDUInfo : UnionCaseInfo =
FSharpType.GetUnionCases(typeof<MyDU>)
|> Array.find (fun x -> x.Name = str)
// val myDUInfo : UnionCaseInfo = MyDU.B
Run Code Online (Sandbox Code Playgroud)
我想转换myDUInfo成一个联合案例,以获得与上面依赖的代码相同的结果match,但不必键入与所有案例对应的字符串。
这可能吗?